Oracle SQL转换函数

时间:2011-11-30 11:26:23

标签: sql oracle

有人可以解释为什么这段代码

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".

由于

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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.

查看表格中的无效日期。