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