我在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:
我知道如何避免这样的错误,但我的问题是为什么会抛出它?
答案 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日没有