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

Kha*_*yat 2 oracle oracle10g

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

SELECT (CURRENT_DATE - INTERVAL '1' YEAR) FROM DUAL;
Run Code Online (Sandbox Code Playgroud)

它运行正常,但今天我收到此错误:

ORA-01839: date not valid for month specified
01839. 00000 -  "date not valid for month specified"
*Cause:    
*Action:
Run Code Online (Sandbox Code Playgroud)

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

Ale*_*ole 8

这是预期的行为; 请参阅文档的datetime/interval算术部分中的第六个项目符号.

当间隔计算返回datetime值时,结果必须是实际的datetime值,否则数据库将返回错误.例如,接下来的两个语句返回错误:

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;
Run Code Online (Sandbox Code Playgroud)

第一个失败是因为在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
Run Code Online (Sandbox Code Playgroud)

您可以使用add_months具有相反行为的行为 - 有时也会造成混淆.您需要确定哪种方式最适合您.