You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Oracle 19c日期世纪问题:同一UPDATE中日期值异常差异

Oracle日期更新异常:同一变量更新两个字段结果不一致

问题描述

在同一条UPDATE语句中,使用值为01.01.1900的同一个日期变量更新两个DATE类型字段时,第一个字段被错误设置为01.01.2000,第二个字段却能得到正确的01.01.1900值。该问题与NLS_DATE_FORMAT参数相关,但行为逻辑不符合预期。

表结构

包含两个DATE类型字段的表结构如下:

Name                    Null?    Type  
 ----------------------- -------- ----------------  
 D1                               DATE  
 D2                      NOT NULL DATE  

存储过程

用于执行更新操作的存储过程代码:

create or replace procedure ppp(d IN Date)
IS
BEGIN
        update ppdates
           set d1 = DECODE (d1, TRUNC(d), NULL, TRUNC(d))
              ,d2 = DECODE (d , NULL    , d2  , TRUNC(d));
END;

执行及结果

初始表数据:

> select * from ppdates;

D1       D2
-------- --------
         10.02.26

执行存储过程:

> execute ppp(to_date('01/01/1900 00:00:00', 'mm/dd/yyyy hh24:mi:ss'));

PL/SQL procedure successfully completed.

查询更新后的结果:

> select to_char(d1,'dd.mm.yyyy'), to_char(d2, 'dd.mm.yyyy') from ppdates;

TO_CHAR(D1 TO_CHAR(D2
---------- ----------
01.01.2000 01.01.1900

临时解决方法

在会话级别设置NLS_DATE_FORMAT参数后,问题恢复正常:

> update ppdates set d1=null, d2=trunc(sysdate);

1 row updated.

> alter session set nls_date_format = 'dd.mm.yyyy';

Session altered.

> execute ppp(to_date('01/01/1900 00:00:00', 'mm/dd/yyyy hh24:mi:ss'));

PL/SQL procedure successfully completed.

> select * from ppdates;

D1         D2
---------- ----------
01.01.1900 01.01.1900

内容的提问来源于stack exchange,提问作者Philippe P.

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 14:03:16