Oracle next_day 函数 returns 日期错误

Oracle next_day function returns wrong date

我是运行 Oracle Database 11g 快捷版。当我发出:

select next_day('04-JUN-15', 'Friday') from dual;

我得到的结果是“05-JUN-15”。
但是当我发出:

select next_day(DATE '15-06-04', 'Friday') from dual;

我得到非常奇怪的结果,即“07-JUN-15”。
同时,这两个日期对我来说看起来是一样的:

select to_char(DATE '15-06-04', 'DD-MM-RR HH24:MI:SS'),  
       to_char(to_date('04-JUN-15'), 'DD-MM-RR HH24:MI:SS')  
       from dual;  

两者都 return '04-06-15 00:00:00'.
有人可以解释为什么它以这种方式工作吗?

谢谢!

select next_day(DATE '15-06-04', 'Friday') from dual => "June, 07 0015 00:00:00"

这看起来像是 15 年(即 2000 年前)!可能不是你要找的。

select DATE '15-06-04' from dual => "June, 04 0015 00:00:00"

这是将你的日期读取为 YY-MM-DD,年份为 0015。我不确定你为什么要使用 DATE 转换字符串,to_date 应该做你想做的而且您已经在使用它了。

next_day(DATE '15-06-04', 'Friday')

您刚刚重新发明了 Y2K 漏洞。年份应始终为 YYYY 格式,完整的 4 位数字。或者,使用 RR 格式和 TO_DATE。您需要注意 RR 格式的某些规则。

ANSI 日期文字 不包含时间部分,必须完全按照这种格式指定 ('YYYY-MM-DD')。

进行此更正,您将得到正确的结果:

ANSI 日期文字

SQL> SELECT next_day(DATE '2015-06-04', 'Friday') FROM dual;

NEXT_DAY(
---------
05-JUN-15

SQL>

TO_DATE RR 格式

SQL> SELECT next_day(TO_DATE('15-06-04', 'RR-MM-DD'), 'Friday') FROM dual;

NEXT_DAY(
---------
05-JUN-15

SQL>