Oracle SQL 関数 : TO_YMINTERVAL : 文字列を年月期間型に変換
YM_Ret := TO_YMINTERVAL( strPara ); TO_YMINTERVAL 関数は指定文字列を INTERVAL YEAR TO MONTH型に変換します。 strPara : "[+|-]YY-MM" YY:年数、MM:月数、+:加算(デフォルト値)、-:減算
TO_YMINTERVAL 関数の戻り値を日付データに加算することで、期間後(前)の日付が計算できます。
以下に TO_YMINTERVAL 関数の例を示します。
SQL> SELECT 2 SYSDATE AS "当日" 3 ,SYSDATE + TO_YMINTERVAL('01-00') AS "1年後" 4 ,SYSDATE + TO_YMINTERVAL('-01-00') AS "1年前" 5 ,SYSDATE + TO_YMINTERVAL('+00-01') AS "1月後" 6 ,SYSDATE + TO_YMINTERVAL('-00-01') AS "1月前" 7 ,SYSDATE + TO_YMINTERVAL('01-02') AS "1年2月後" 8 FROM DUAL; 当日 1年後 1年前 1月後 1月前 1年2月 -------- -------- -------- -------- -------- -------- 21-04-21 22-04-21 20-04-21 21-05-21 21-03-21 22-06-21
少し気になったので以下をテストしてみました。
・日付に「うるう日」を指定し、1年後の計算を行うと、エラーが発生しました。
・日付に「うるう日」を指定し、1か月後の加算を行うと、エラーは発生しませんでした。
・「大の月の31日」の1か月後の加算を行うと、エラーが発生しました。
SQL> SELECT 2 TO_DATE('2020/02/29') + TO_YMINTERVAL('01-00') AS "うるう日の1年後" 3 FROM DUAL; TO_DATE('2020/02/29') + TO_YMINTERVAL('01-00') AS "うるう日の1年後" * 行2でエラーが発生しました。: ORA-01839: 指定された月に対して日付が無効です SQL> SELECT 2 TO_DATE('2020/02/29') + TO_YMINTERVAL('00-01') AS "うるう日の1月後" 3 FROM DUAL; うるう日 -------- 20-03-29 SQL> SELECT 2 TO_DATE('2021/03/31') + TO_YMINTERVAL('00-01') AS "大の月の1月後" 3 FROM DUAL; TO_DATE('2021/03/31') + TO_YMINTERVAL('00-01') AS "大の月の1月後" * 行2でエラーが発生しました。: ORA-01839: 指定された月に対して日付が無効です
上記から言えるのは TO_YMINTERVAL 関数で指定された「年、月」をそのまま指定日付の「年」及び「月」に加算して
結果を日付とするため、加算後の年月日があり得ない日付であればエラーが出ると思います。
この関数は使い方に注意が必要です。