このトピックでは、ABAPにおける日付の処理方法を纏めて説明します。
日付項目は文字型であり、数値型ではありません。但し、ABAPでは自動的にデータ型変換が実行されるため、日付項目でも数値演算を行うことができます。 なお、SAP標準から様々な日付を計算するための汎用モジュールが用意されているため、それらを利用することもできます。
指定された日付より何日前又は、何日後の日付を計算するには、日付項目と数値項目の加減算により簡単に実現できます。
DATA: W_DATE TYPE D, W_3DAY_BEFORE TYPE D, W_5DAY_AFTER TYPE D. W_DATE = SY-DATUM. W_DATE+6(2) = '01'.
日単位だけではなく、月又は年単位で日付の加減算を行うには、汎用モジュールRP_CALC_DATE_IN_INTERVALE(ステータス:未リリース)を使用することができます。
DATA: l_date TYPE d VALUE '20161201'. DO 2 times. CALL FUNCTION 'RP_CALC_DATE_IN_INTERVAL' EXPORTING date = l_date days = 0 months = 1 signum = '+' years = 0 IMPORTING calc_date = l_date. WRITE: / l_date. ENDDO.
指定された日付の月初や月末日付を取得するには、汎用モジュールHR_JP_MONTH_BEGIN_END_DATE(ステータス:未リリース)を使用することができます。
DATA: W_DATE TYPE D, W_MONTH_FIRST_DATE TYPE D, W_MONTH_LAST_DATE TYPE D. W_DATE = SY-DATUM. CALL FUNCTION 'HR_JP_MONTH_BEGIN_END_DATE' EXPORTING IV_DATE = W_DATE IMPORTING EV_MONTH_BEGIN_DATE = W_MONTH_FIRST_DATE EV_MONTH_END_DATE = W_MONTH_LAST_DATE.
月初日付だけを取得する場合では、汎用モジュールよりも、日付を文字列としてDAYの部分を'01'に置き換えることで簡単に実現できます。 なお、月末日だけを取得する場合では、汎用モジュールLAST_DAY_OF_MONTHS(ステータス:未リリース)を利用することも可能です。
DATA: W_DATE TYPE D. W_DATE = SY-DATUM. W_DATE+6(2) = '01'.
指定された日付がその年の1月1日から数えて何週目かを判断するには、汎用モジュール「DATE_GET_WEEK」を使用できます。 その何週目の情報は、年・週(yyyyww)の形式で汎用モジュールから返却されます。
DATA: W_DATE TYPE SCAL-DATE, W_WEEK TYPE SCAL-WEEK. WK_DATE = SY-DATUM. CALL FUNCTION 'DATE_GET_WEEK' EXPORTING DATE = W_DATE IMPORTING WEEK = W_WEEK EXCEPTIONS DATE_INVALID = 1 OTHERS = 2.
汎用モジュールWEEK_GET_FIRST_DAY(ステータス:リリース)を使用すれば、年と週番号から、該当の週の月曜日の日付を取得することができます。
DATA: DATUM LIKE SCAL-DATE, WOCHE LIKE SCAL-WEEK. WOCHE = '201521'. "2015年21週目 CALL FUNCTION 'WEEK_GET_FIRST_DAY' EXPORTING WEEK = WOCHE IMPORTING DATE = DATUM "2015/05/18が戻される EXCEPTIONS WEEK_INVALID = 1.