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月の初日と末日を返します。翌月へ移動したい場合は月数の加減算を別に行います。 - 暦月と業務期間:この計算で得るのは暦上の月初・月末です。会計期間、給与期間、稼働日カレンダーの境界とは必ずしも一致しません。
- 入力値:初期値や存在しない日付を計算に使わず、外部入力は先に検証します。
参考・関連記事
- nヶ月後・前の日付を計算する方法:先月や翌月の月初・月末が必要なときは、基準日を移動してからその月の範囲を求めます。
- 日付の妥当性チェック:外部データを基準日に使う前の入力検証に役立ちます。
- 日付から曜日を取得する方法:算出した月初日・月末日の曜日も表示したい場合に使えます。
- 汎用モジュール一覧:ほかの日付処理を探すための入口です。