Oracle next_day函数返回错误的日期

时间:2015-06-04 06:00:14

标签: sql oracle oracle11g date-arithmetic

我正在运行Oracle Database 11g Express Edition。当我发出:

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;  

返回' 04-06-15 00:00:00'。
有人能解释为什么它以这种方式起作用吗?

谢谢!

2 个答案:

答案 0 :(得分:3)

  

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>

答案 1 :(得分:1)

  

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应该做你想要的和你正在使用它。