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