ABAPで月初日・月末日を取得|HR_JP_MONTH_BEGIN_END_DATEの使い方

ABAPで指定日が属する月の初日と末日を求めるなら、汎用モジュール HR_JP_MONTH_BEGIN_END_DATE を使う方法があります。たとえば 20240215 を渡すと、月初日の 20240201 と月末日の 20240229 を取得できます。月次データの抽出期間や、帳票の対象期間を作るときに便利です。

HR_JP_MONTH_BEGIN_END_DATEの引数と戻り値

パラメータ方向内容
IV_DATE入力月初・月末を求めたい基準日
EV_MONTH_BEGIN_DATE出力基準日が属する月の初日
EV_MONTH_END_DATE出力基準日が属する月の末日

出力はいずれもABAPの日付型です。基準日に月初日や月末日そのものを渡しても、その同じ月の初日と末日を取得します。外部ファイルなどから受け取った日付を使う場合は、計算前に日付として妥当かを検証してください。

月初日・月末日を取得するABAPコード例

DATA lv_date        TYPE d VALUE '20240215'.
DATA lv_month_begin TYPE d.
DATA lv_month_end   TYPE d.

CALL FUNCTION 'HR_JP_MONTH_BEGIN_END_DATE'
  EXPORTING
    iv_date             = lv_date
  IMPORTING
    ev_month_begin_date = lv_month_begin
    ev_month_end_date   = lv_month_end.

" lv_month_begin = '20240201'
" lv_month_end   = '20240229'

2024年はうるう年なので、2月の月末は29日です。sy-datum を IV_DATE に渡せば、実行日の属する月の範囲を取得できます。業務上の基準日が別にある場合は、その日付を明示して渡します。

未リリースの汎用モジュールを使う前に

HR_JP_MONTH_BEGIN_END_DATE は日本の人事給与系に由来する汎用モジュールです。SAP HelpのDate FAQではR/3・ECC向けの方法として挙げられています。導入製品やリリースによって利用可能なAPIは異なるため、対象システムのSE37などで搭載状況とリリース状態を確認してください。未リリースと表示される環境では、標準インターフェースとしての互換性を前提にせず、将来の変更リスクを考慮します。ABAP Cloudのように利用できるAPIが制限される環境でも、そのまま使えるとは限りません。

汎用モジュールを使わずに求める方法

暦月の範囲だけが必要なら、日付型の計算でも求められます。日付文字列 YYYYMMDD の末尾2桁は日(DD)です。そこを 01 にして月初日を作り、翌月の月初日の前日を月末日とします。

DATA lv_date             TYPE d VALUE '20240215'.
DATA lv_month_begin      TYPE d.
DATA lv_next_month_begin TYPE d.
DATA lv_month_end        TYPE d.

" 入力日付が有効であることを確認したうえで計算
lv_month_begin = lv_date.
lv_month_begin+6(2) = '01'.

" 月初日から32日後は必ず翌月(上限日付付近を除く)
lv_next_month_begin = lv_month_begin + 32.
lv_next_month_begin+6(2) = '01'.
lv_month_end = lv_next_month_begin - 1.

" lv_month_begin = '20240201'
" lv_month_end   = '20240229'

この方法でも、2月の日数や年またぎを日付型の計算に任せられます。ただし 9999 年末など日付型の上限付近は加算できないため、入力範囲を制限するか例外処理を用意してください。既存システムの設計方針に合う方法を選びます。

実装時に確認したい境界値と業務上の違い

  • うるう年:20240215 の月末は 20240229、20230215 の月末は 20230228 です。
  • 年またぎ:20241231 を基準にすれば、同じ2024年12月の初日と末日を返します。翌月へ移動したい場合は月数の加減算を別に行います。
  • 暦月と業務期間:この計算で得るのは暦上の月初・月末です。会計期間、給与期間、稼働日カレンダーの境界とは必ずしも一致しません。
  • 入力値:初期値や存在しない日付を計算に使わず、外部入力は先に検証します。

参考・関連記事

関連記事

PAGE TOP