Oracle SQL 関数 : MONTHS_BETWEEN : 月数の計算
dateRet := MONTHS_BETWEEN( date1 , date2 ); MONTHS_BETWEENはdate1とdate2の間の月数を返します。date1がdate2より大きい場合は正の値を、また date2がdate1より大きい場合は負の値を返します。同一日での比較の場合、及び月末同士の比較の場合は 結果は整数の値になります。その他の場合は、1ヶ月を31日とした換算値が返されます。
SQL> SELECT
2 MONTHS_BETWEEN(TO_DATE('2004/02/14'), TO_DATE('2004/01/14')) AS 月違いの同一日
3 ,MONTHS_BETWEEN(TO_DATE('2004/01/14'), TO_DATE('2004/02/14')) AS 同上負値
4 ,MONTHS_BETWEEN(TO_DATE('2004/01/14'), TO_DATE('2004/01/13')) AS 一日違い
5 ,MONTHS_BETWEEN(TO_DATE('2004/02/29'), TO_DATE('2004/01/27')) AS 閏年1
6 ,MONTHS_BETWEEN(TO_DATE('2004/02/29'), TO_DATE('2004/01/28')) AS 閏年2
7 ,MONTHS_BETWEEN(TO_DATE('2004/02/29'), TO_DATE('2004/01/29')) AS 閏年3
8 ,MONTHS_BETWEEN(TO_DATE('2004/02/29'), TO_DATE('2004/01/30')) AS 閏年4
9 ,MONTHS_BETWEEN(TO_DATE('2004/02/29'), TO_DATE('2004/01/31')) AS 閏年5
10 ,MONTHS_BETWEEN(TO_DATE('2004/11/30'), TO_DATE('2004/10/29')) AS T29
11 ,MONTHS_BETWEEN(TO_DATE('2004/11/30'), TO_DATE('2004/10/30')) AS T30
12 ,MONTHS_BETWEEN(TO_DATE('2004/11/30'), TO_DATE('2004/10/31')) AS T31
13 FROM DUAL;
月違い同一日 同上負値 一日違い 閏年1 閏年2 閏年3 閏年4 閏年5 T29 T30 T31
------------ ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ---------- ----------
1 -1 .032258065 1.06451613 1.03225806 1 .967741935 1 1.03225806 1 1
上記に、いろいろな場合のMONTHS_BETWEENの結果を表示しています。
少し問題があるとすれば、閏年の場合には29日を1ヶ月として計算しているようである。
但し、1月31日には月末の処理がなされて結果は1ヶ月の差として返されている。このあたりは、月数を処理する場合には注意が必要かもしれません。
尚、MONTHS_BETWEENの応用として、年齢の計算について以下に示します。
SQL> SELECT TRUNC(MONTHS_BETWEEN(SYSDATE, TO_DATE('1964/10/12')) / 12) AS AGE FROM DUAL;
AGE
----------
40