首页 > 解决方案 > 为什么更新查询语句中日期的年份部分在年份> = 2050时更新错误年份

问题描述

我正在尝试插入/更新DATE_OF_RETIREMENT列,但是当年份 >=2050 时,它需要 1950 年。

例子:

UPDATE EMPLOYEE
SET STATUS             = '4',
    ISACTIVE           = 1,
    DATE_OF_RETIREMENT = '30-APR-49'
WHERE ID = 2001;
  

这里DATE_OF_RETIREMENT更新为30 APR 2049.

但在以下情况下:

UPDATE EMPLOYEE
SET STATUS             = '4',
    ISACTIVE           = 1,
    DATE_OF_RETIREMENT = '30-APR-52'
WHERE ID = 2001;
  

此处DATE_OF_RETIREMENT更新为30 APR 1952.

谁能告诉我发生这种情况的原因?

标签: sqloracledate2-digit-year

解决方案


使用 4 位数字表示年份;我希望你不是想节省一些磁盘空间,是吗?Y2K 落后了我们 20 年。

查看多年来RR和格式掩码之间的区别。YY根据它(年份)是在本世纪第 50 年之前还是之后,您会得到不同的结果。

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

Session altered.

SQL> select to_date('30-04-49', 'dd.mm-rr') val1_rr,
  2         to_date('30-04-49', 'dd.mm-yy') val2_yy,
  3         --
  4         to_date('30-04-52', 'dd.mm-rr') val3_rr,
  5         to_date('30-04-52', 'dd.mm-yy') val4_yy
  6  from dual;

VAL1_RR    VAL2_YY    VAL3_RR    VAL4_YY
---------- ---------- ---------- ----------
30.04.2049 30.04.2049 30.04.1952 30.04.2052

SQL>

推荐阅读