首页 > 解决方案 > Oracle SQL:使用 to_date 时输出错误的年份

问题描述

我正在为报告编写 Oracle SQL 语句。用户可以输入 FROM / TO 日期,我将其与已发布的行进行比较(简化):

… where changedate < to_date(user_input, 'dd.MM.YYYY')…

字段“changedate”是此表中的数据类型 DATE。

代码:

select to_date(changedate, 'dd.MM.YYYY') from TICKETSTATUS;

该字段通常包含

30.03.2019 21:50:48

但我用代码转换它的输出是:

30.03.0019

为什么这样做?我想要“2019”作为年份,但它似乎删除了前两个数字?有人可以解释并帮助我解决这个问题吗?谢谢!

标签: sqloracle

解决方案


尝试通过两种类型的格式插入rrrryyyy查看年份值以查看差异:

create table ticketstatus( id int, changedate date );
insert into ticketstatus values(1,to_date('30.03.19','dd.mm.yyyy'));
insert into ticketstatus values(2,to_date('31.03.19','dd.mm.rrrr'));

select changedate
  from ticketstatus;

CHANGEDATE
------------ 
30.03.0019   
31.03.2019

实际上,您可以观察到这种多用途的情况,如下所示:

with ticketstatus(changedate) as
(
 select '30.03.19' from dual
)
select to_date(changedate,'dd.mm.yyyy') date_with_yy,
       to_date(changedate,'dd.mm.rrrr') date_with_rr
  from ticketstatus;

DATE_WITH_YY    DATE_WITH_RR
------------    ------------
30.03.0019      30.03.2019

这被称为Year 2k problem,而年份格式rrrr源于此问题。因此,日期格式rrrr可用于解决此类问题。


推荐阅读