以下の例では、date_expressionのDAYの値、またはtimestamp_expressionの日付要素が29、30、または31の場合に、ADD_MONTHS関数の結果が常に期待通りにはならないことを例示しています。
単純にするために、すべての例でdate_expressionを使用しています。どのケースでも、関数は設計どおりに動作しています。
例: 無効な日付を問合わせる
この例では、SELECT文の結果は、1996年2月の日付です。1996年2月31日が有効な日付だったとしたらそうなっていたはずですが、2月31日は有効な日付ではないので、ADD_MONTHSは答えを正規化します。
元の日付のDAY値がターゲットの月の最後のDAY値よりも大きかった場合には、この結果は、ターゲットの月の最後の有効なDAY値になります。
SELECT ADD_MONTHS ('1995-12-31', 2);
この例の結果は1996-02-29 になります。
1996年がうるう年だったことに注意する必要があります。間隔が2ヶ月ではなく14ヶ月である場合、結果は'1997-02-28'になります。
例: 現在の日付の前の月を問合わせる
この文は、例: 現在の日付から1ヶ月後の日付を問合わせるのADD_MONTHS関数の逆を実行します。
例の元の日付である‘1999-01-30’に戻るはずと思われますが、そうはなりません。
SELECT ADD_MONTHS ('1999-02-28' , -1);
ADD_MONTHSは結果として1999-01-28を戻します。
関数は設計どおりに実行し、結果はエラーではありませんが、例: 現在の日付から1ヶ月後の日付を問合わせるから期待した結果ではないでしょう。
例: 現在の日付から1ヶ月後の日付で、28日に終わる月を問合わせる
次の文は‘1999-03-31’を戻すものと期待されますが、そうなりません。
SELECT ADD_MONTHS ('1999-02-28' , 1);
ADD_MONTHSは結果として1999-03-28を戻します。
例: 現在の日付から1ヶ月後の日付で、30日に終わる月を問合わせる
次の文は‘1999-03-31’を戻すものと期待されますが、そうなりません。
SELECT ADD_MONTHS ('1999-04-30' , -1);
ADD_MONTHSは結果として1999-03-30を戻します。
例: 現在の日付から1ヶ月後の日付で、30日に終わる月を問合わせる
次の文から'1999-05-31'が返されるものと考えられますが、結果は異なります。
SELECT ADD_MONTHS ('1999-04-30' , 1);
ADD_MONTHSは結果として1999-05-30を戻します。