2つの日付の差、2つの日付が何ヵ月離れているか求める

ADD_MONTHS

syntax

MONTHS_BETWEEN ( datetime1 , datetime2 )
return [ number ]

parameter

datetime1日付式1 (DATE 型)
datetime2日付式2 (DATE 型)

return

  • 2つの日付式の月の差を小数点も含めて戻す

avail

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

MONTHS_BETWEEN 関数の内容

日付式の datetime1 - datetime2 が何ヵ月かを戻す。
2つの日にち(日の部分)が異なる場合には 1ヵ月を 31 日換算し小数点付きで戻す。但し、双方が月末の場合は同日とみなす。 ( 1 日は 約 0.032 ヵ月)

MONTHS_BETWEEN 使用例

MONTHS_BETWEEN('00-2-28','99-12-31') ⇒ 1.9032 (日付形式が'RR-MM-DD'の場合)
MONTHS_BETWEEN('00-2-29','99-12-31') ⇒ 2.0    (月末処理は考慮されている)

日付と日付の減算処理の豆知識

日付・時間の加算と減算では 日付と日数の計算が行なえ、日付同士の引き算もできる。日付同士の引き算は小数点を含む日数(※) 、または、タイムスタンプ型への暗黙変換が発生すると 期間値(INTERVAL) で戻される。期間値においては掛け算も行なえる。なお、日付同士の加算はできない。

(※) 日付同士の引き算の結果を NUMTODSINTERVAL 関数 を使用して期間値に変換すると小数点による誤差によって正しい結果が導き出せない場合がある。

2000年1月2日 から 2000年1月1日を引く

SQL> select DATE '2000-02-01' - DATE '2000-01-01' from dual;
 
DATE'2000-02-01'-DATE'2000-01-01'
---------------------------------
                               31

2000年1月1日 午前1時 から 同日0時 を引く

SQL> select TIMESTAMP '2000-01-01 01:00:00' - DATE '2000-01-01' from dual;
 
TIMESTAMP'2000-01-0101:00:00'-DATE'2000-01-01'
---------------------------------------------------------------------------
+000000000 01:00:00.000000000

DATE 型に明示変換してから計算すると、旧来の日付の差を取得できる。但し キャストしているため DATE 型以上の情報は切り捨てられる。

SQL> select CAST(TIMESTAMP '2000-01-01 01:00:00' AS DATE)
  2         - DATE '2000-01-01' regacy
  3   from dual;
 
    REGACY
----------
.041666667

型をキャストする CAST 関数

日付同士の加算をすると

SQL> select DATE '2000-02-01' + DATE '2000-01-01' from dual;
select DATE '2000-02-01' + DATE '2000-01-01' from dual
                         *
行1でエラーが発生しました。:
ORA-00975: 日付と日付の加算はできません。

日にちの足し算

誕生日から年齢を計算する

2003-02-28 時点において 2000-02-29 生まれの年齢は 2歳 のため以下の MONTHS_BETWEEN を使った式は誤った年齢となってしまう。
誕生日と年齢計算について(数え年、満年齢、民法による年齢)

SQL> select trunc(MONTHS_BETWEEN(DATE '2003-02-28', DATE '2000-02-29')/12) YEARS_OLD
  2   from dual;
 
 YEARS_OLD
----------
         3
 


SQL 関数 - MONTHS_BETWEEN 関連

 
アルファベット別 関数一覧 ショートカット
ABCDEFG
HILMNOP
RSTUVWX
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle のライセンスがわからない…
Oracle Direct (ネットで聞いても最後はここで要確認)