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.
相关产品推荐
相关产品推荐

