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

MONTHS_BETWEEN 関数

syntax

ADD_MONTHS ( datetime , integer )
return [ DATE ]

parameter

datetime日付式 (DATE 型)
integer加算する月数

return

  • 加算、または、減算された日付値を DATE 型で戻す

avail

  • SQL および PL/SQL の両方で使用可能。

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) のような表記をすることが多い。

1 日後、2 時間後、3 分後、4 秒後を求める式

-- alter session set nls_date_format = 'yyyy-mm-dd hh24:mi:ss';
select DATE '2000-01-01' + 1           "2000/01/01+1day",
       DATE '2000-01-01' + 2/24        "2000/01/01+2hr", 
       DATE '2000-01-01' + 3/24/60     "2000/01/01+3min",
       DATE '2000-01-01' + 4/24/60/60  "2000/01/01+4sec"
from dual;
 
2000/01/01+1day     2000/01/01+2hr	2000/01/01+3min     2000/01/01+4sec
------------------- ------------------- ------------------- -------------------
2000-01-02 00:00:00 2000-01-01 02:00:00 2000-01-01 00:03:00 2000-01-01 00:00:04

期間リテラル および、期間式 を用いれば掛け算や割り算なしに年単位、日、時、分、秒単位を直接記述できる。
注意:月単位の加算減算を ADD_MONTHS ではなく期間式によって行なうと末日処理が行なわれないため結果がエラー(※)となることがある。

2000年1月1日から 123 年 11 ヵ月前

SQL> select DATE '2000-01-01' - INTERVAL '123-11' YEAR(3) TO MONTH from dual;
 
DATE'2000-01-01'-IN
-------------------
1876-02-01 00:00:00

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> select DATE '2000-02-29' + INTERVAL '1' YEAR from dual;
select DATE '2000-02-29' + INTERVAL '1' YEAR from dual
                         *
行1でエラーが発生しました。:
ORA-01839: 指定された月に対して日付が無効です

日付同士の引き算

 


SQL 関数 - ADD_MONTHS 関連

 
アルファベット別 関数一覧 ショートカット
ABCDEFG
HILMNOP
RSTUVWX
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ オラクルサポートセンター