2011-11-30 89 views
2

可能有人请解释为什么这代码的Oracle SQL转换功能

to_date('25-JAN', 'DD-MON') 

作品,这不

to_date(to_char(date_of_birth, 'DD-MON'), 'DD-MON')

运行

to_char(date_of_birth, 'DD-MON')

这是内功能在它自己的瓦特兽人,但后来引发

"ORA-01839 error: date not valid for month specified". 

感谢

回答

0

你有一个无效的一天,特定月份在你的餐桌, 例如:

SQL> select date '1996-01-29' + interval '1' month as col_1 
    2 ,  date '1997-01-29' + interval '1' month as col_2 
    3 ,  date '1997-08-11' - interval '3' month as col_3 
    4 from dual; 
,  date '1997-01-29' + interval '1' month as col_2 
         * 
ERROR at line 2: 
ORA-01839: date not valid for month specified 


    SQL> 
    SQL> select date '1996-01-29' + interval '1' month as col_1 
     2 ,  date '1997-01-28' + interval '1' month as col_2 
     3 ,  date '1997-08-11' - interval '3' month as col_3 
     4 from dual; 
    Enter... 

    29-02-1996 28-02-1997 11-05-1997 

    1 row selected. 

看看你的表内的无效天一个月。

+0

感谢Nammari,我是能够在我尝试从中提取数据的列中找到'29 -FEB'。从现在开始我会留意这种情况。 –

6

您的代码可以正常工作,1月25日作为日期。问题是日期需要一年。所以当你这样做时:

TO_DATE('25-JAN', 'DD-MON') 

...... Oracle需要建立一个完整的日期并假设当前年份。证明:

SELECT TO_CHAR(TO_DATE('25-JAN', 'DD-MON')) 
FROM DUAL 

...打印:

25/01/2011 00:00:00 

当然,还有一个月,不总是有相同的天数是:二月

SELECT TO_CHAR(TO_DATE('29-FEB-2000', 'DD-MON-YYYY')) 
FROM DUAL 
-- 29/02/2000 00:00:00 

SELECT TO_CHAR(TO_DATE('29-FEB', 'DD-MON')) 
FROM DUAL 
-- ORA-01839: date not valid for month specified 
+0

非常感谢,我做了一个搜索(在OE模式中的客户表date_of_birth列),并发现'29 -FEB',这意味着错误是2011年的结果不是一个闰年,愚蠢的我。我很高兴,现在我知道在处理日期数据类型列时应该注意些什么。再次感谢。 –

+0

@AndrewMudamai欢迎您。随时将问题标记为已回答,以便将来可以帮助其他人。 –