当我从当前日期减去一年后,为什么会出现Oracle错误?

时间:2012-02-29 08:41:12

标签: oracle oracle10g

我在Oracle数据库10g上有这个查询:

SELECT (CURRENT_DATE - INTERVAL '1' YEAR) FROM DUAL;

它运行正常,但今天我收到了这个错误:

ORA-01839: date not valid for month specified
01839. 00000 -  "date not valid for month specified"
*Cause:    
*Action:

我知道如何避免这样的错误,但我的问题是为什么会抛出它?

2 个答案:

答案 0 :(得分:8)

这是预期的行为;请参阅文档的第六个项目in the datetime/interval arithmetic section

  

当间隔计算返回日期时间值时,结果必须为   实际的日期时间值或数据库返回错误。对于   例如,接下来的两个语句返回错误:

SELECT TO_DATE('31-AUG-2004','DD-MON-YYYY') + TO_YMINTERVAL('0-1')
FROM DUAL;

SELECT TO_DATE('29-FEB-2004','DD-MON-YYYY') + TO_YMINTERVAL('1-0')
FROM DUAL;
     

第一次失败是因为将一个月添加到31天的月份   结果是9月31日,这不是一个有效的日期。第二次失败   因为将一年添加到仅存在四年的日期是   无效。但是,下一个语句成功,因为添加了四个   年到2月29日的日期有效:

SELECT TO_DATE('29-FEB-2004', 'DD-MON-YYYY') + TO_YMINTERVAL('4-0')
FROM DUAL;

TO_DATE('
---------
29-FEB-08

您可以使用具有相反行为的add_months - 这有时也会造成混淆。你需要决定哪一个最适合你。

答案 1 :(得分:2)

因为2011年2月29日没有