JavaScriptが無効になっています。
この状態では一部の情報が表示されず、すべての機能を利用することができません。
2つの日付の差、2つの日付が何ヵ月離れているか求める
⇒ ADD_MONTHS
MONTHS_BETWEEN ( datetime1 , datetime2 )
return [ number ]
datetime1 日付式1 (DATE 型) datetime2 日付式2 (DATE 型)
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 関連