Oracle SQL 関数 : ADD_MONTHS : 翌月日計算

 dateRet := ADD_MONTHS( dateSrc , N );
  
  ADD_MONTHSは日付dataSrcにNヵ月後の結果を返します。dataSrcの月数にNを加算した結果、日付が
  その月の最終日を越える場合は、日の部分はその月の最終日を返します。
SQL> SELECT SYSDATE,ADD_MONTHS(SYSDATE,1) AS ADD_1,
  2         ADD_MONTHS(SYSDATE,13) AS ADD_13,
  3         ADD_MONTHS(TO_DATE('2002/01/31'),1) AS ADD_N FROM DUAL;

SYSDATE  ADD_1    ADD_13   ADD_N
-------- -------- -------- --------
02-11-07 02-12-07 03-12-07 02-02-28


ADD_MONTHS の例として ADD_MONTHS(SYSDATE,13) はシステム日付の1年と1ヵ月後の日付を返します。
また、最後の ADD_MONTHS(TO_DATE('2002/01/31'),1) は1ヶ月後の2月には31日は存在しない為、2月の最終日が結果として帰ります。


指定された日付が月末の場合、月数を加算後の月の月末に合わせてくれる様です。 以下に例を示します。
閏(うるう)年の1月の末日に対して「1」を加算することで、2月の月末が結果として返されます。

SQL> SELECT
  2       ADD_MONTHS(TO_DATE('2002/01/31'), 1)   AS "NOT-閏年"
  3      ,ADD_MONTHS(TO_DATE('2004/01/31'), 1)   AS "閏年"
  4  FROM DUAL;

NOT-閏年 閏年
-------- --------
02-02-28 04-02-29


ADD_MONTHS の加算される月数は正の整数のほか マイナス値 でも正常に動く様です。 以下にその例を示します。
閏年と閏年ではない2月の末日を指定日として「-1」を加算指定すると、結果は共に1月の末日が返されます。

SQL> SELECT
  2       ADD_MONTHS(TO_DATE('2002/02/28'), -1)   AS "NOT-閏年"
  3      ,ADD_MONTHS(TO_DATE('2004/02/29'), -1)   AS "閏年"
  4  FROM DUAL;

NOT-閏年 閏年
-------- --------
02-01-31 04-01-31