2012-02-29 7 views
2

私は、Oracle Database 10gでこのクエリを持っている:現在の日付から1年間を引くと、なぜOracleエラーが発生しますか?

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

2011年2月29日がなかったため、

+0

ありがとうございます。 ORACLEのバグ。 –

+3

いいえ、バグではありません。あなたは3月30日から1ヶ月を引くと同じことができます – zerkms

8

予想される動作です。ドキュメントの第6弾in the datetime/interval arithmetic sectionを参照してください。

When interval calculations return a datetime value, the result must be an actual datetime value or the database returns an error. For example, the next two statements return errors:

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; 

The first fails because adding one month to a 31-day month would result in September 31, which is not a valid date. The second fails because adding one year to a date that exists only every four years is not valid. However, the next statement succeeds, because adding four years to a February 29 date is valid:

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

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

あなたは反対の行動があるadd_months、使用することができます - も時々混乱を引き起こす可能性があります。あなたはあなたに最も適しているものを決定する必要があります。

+0

もっとclear.thank –

関連する問題