日付に月単位に加減算、日付の足し算と引き算
⇒ MONTHS_BETWEEN 関数

ADD_MONTHS ( datetime , integer )
return [ DATE ]
| datetime | 日付式 (DATE 型) |
| integer | 加算する月数 |
- 加算、または、減算された日付値を DATE 型で戻す

ADD_MONTHS 関数の内容
日付 datetime に 月数 integer を加えた日付値を DATE 型で戻す。
月数 integer にマイナス値を指定することも可能。月数は整数に切り捨てられる。
TIMESTAMP 型の引数に注意
日付 datetime に TIMESTAMP 型を使用すると DATE 型に 暗黙変換 で秒以下の情報が切り捨てられる。
注意
ADD_MONTHS 処理を複数回に分けてはいけない。
ADD_MONTHS(ADD_MONTHS('2000/03/30', -1),-1) ⇒ 2000/01/31
ADD_MONTHS('2000/03/30', -2) ⇒ 2000/01/30 (違う日付になる)
ADD_MONTHS 使用例
SQL> select dt, mons, add_months(dt, mons) from add_months_sample;
DT MONS | ADD_MONTHS(DT,MONS)
------------------- ------ -------------------
2000-01-31 01:02:03 1 | 2000-02-29 01:02:03
2000-02-28 01:02:03 -1 | 2000-01-28 01:02:03
|
2000-02-29 01:02:03 12 | 2001-02-28 01:02:03
|
2000-03-30 01:02:03 -1 | 2000-02-29 01:02:03
2000-03-29 01:02:03 -1 | 2000-02-29 01:02:03
2000-02-01 01:02:03 .5 | 2000-02-01 01:02:03
|
2000-02-01 01:02:03 .9999 | 2000-02-01 01:02:03
日にちの足し算と引き算に関する豆知識
年、日にち単位の足し算と引き算。時、分、秒の時間単位の足し算、引き算
日付は数値の加算と減算のように 日付値に +1 することで 1日後、-1 することで 1日前のように加減算できる。
1秒後の求めるには 1/24/60/60 のように 1/86400 日を加算することで、1分後も同様に 1/24/60 を加算、1時間後も 1/24 を加算することで求めることができる。
日付を小数にして加減算する場合には理解しやすくするために datetime + 1/24/60/60 や datetime + 1/(24*60*60) のような表記をすることが多い。
期間リテラル および、期間式 を用いれば掛け算や割り算なしに年単位、日、時、分、秒単位を直接記述できる。
注意:月単位の加算減算を ADD_MONTHS ではなく期間式によって行なうと末日処理が行なわれないため結果がエラー(※)となることがある。
2000年1月1日から 5 * 10 ヵ月後
SQL> select DATE '2000-01-01' + 5 * INTERVAL '10' MONTH from dual;
DATE'2000-01-01'+5*
-------------------
2004-03-01 00:00:00
2000年1月1日から 999 日 と 1 時間 2 分 3秒後
SQL> select DATE '2000-01-01' + INTERVAL '999 1:2:3' DAY(3) TO SECOND from dual;
DATE'2000-01-01'+IN
-------------------
2002-09-26 01:02:03
⇒ 期間リテラルの書き方
(※) ADD_MONTHS を使わない月の足し算の注意点
SQL> select DATE '2000-01-31' + INTERVAL '1' MONTH from dual;
select DATE '2000-01-31' + INTERVAL '1' MONTH from dual
*
行1でエラーが発生しました。:
ORA-01839: 指定された月に対して日付が無効です
⇒ 日付同士の引き算
SQL 関数 - ADD_MONTHS 関連