【COBOL学習|実務向け】日付計算の決定版!INTEGER-OF-DAY関数で「日付の加減算」を攻略する

1. 導入:なぜ日付計算は面倒なのか

COBOLでの日付処理、皆さんはどうしていますか?「うるう年判定」や「月末処理」を自前で実装しようとすると、ロジックが複雑になりバグの温床になりがちです。そんな時、日付を「1601年1月1日からの経過日数(通日)」という共通の数値に変換できれば、単純な四則演算だけで日付の加減算が可能になります。本稿では、そのための強力な武器であるINTEGER-OF-DAY関数を解説します。

2. 基礎知識:通日(整数)とは

通日(Integer)とは、ある基準日(COBOLでは1601年1月1日)を「1」として、1日経過するごとに1ずつ増える整数のことです。
例えば、「2023年10月27日」という人間が読みやすい形式を、コンピュータが計算しやすい「152179」といった数値に変換します。この形式にしてしまえば、「3日後の日付を知りたい」という要件も、単に数値に3を足して、逆関数であるDAY-OF-INTEGERで戻すだけで解決します。

3. 実装/解決策:変換の仕組み

INTEGER-OF-DAY関数は、YYYYDDD(4桁の西暦+3桁の通日)形式の数値を引数に取ります。
注意点として、入力値は数値または数字項目である必要があります。例えば「2023年10月27日」を変換する場合、まず「2023」年と「300」日目(10月27日)を連結して「2023300」という数値を作り、それを関数に渡します。

4. サンプルプログラム

以下のコードは、特定の日付を通日形式に変換し、さらに10日後の日付を算出する実務的な例です。

IDENTIFICATION DIVISION.
PROGRAM-ID. DATE-CALC-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
  • 日付計算用のワーク
01 WS-INPUT-DATE PIC 9(7) VALUE 2023300. > 2023年10月27日 01 WS-INTEGER-VAL PIC S9(9). > 通日格納用 01 WS-RESULT-VAL PIC S9(9). > 計算後の通日 01 WS-NEW-DATE PIC 9(7). > 変換後の日付 PROCEDURE DIVISION. > 1. YYYYDDD形式を通日(整数)に変換 COMPUTE WS-INTEGER-VAL = FUNCTION INTEGER-OF-DAY(WS-INPUT-DATE). > 2. 10日後の通日を算出(単純な加算が可能!) COMPUTE WS-RESULT-VAL = WS-INTEGER-VAL + 10. > 3. 通日をYYYYDDD形式に戻す COMPUTE WS-NEW-DATE = FUNCTION DAY-OF-INTEGER(WS-RESULT-VAL). DISPLAY "元の日付: " WS-INPUT-DATE DISPLAY "10日後の日付: " WS-NEW-DATE GOBACK.

5. 応用・注意点:現場で陥りやすい罠

・入力形式の厳密性
INTEGER-OF-DAYの引数は、必ず「西暦4桁+その年の経過日数3桁」である必要があります。月・日(MMDD)のまま渡すとエラーになるか、意図しない値になります。必ず日付編集用ルーチンでYYYYDDD形式に変換してから渡すようにしてください。

・うるう年の意識不要
この関数の最大のメリットは、うるう年を考慮する必要がない点です。2月28日の翌日が2月29日になるか3月1日になるか、といった判定ロジックを自分で書く必要はありません。全て内部の整数値計算で自動的に処理されます。

・まとめ
日付の比較や差分計算が発生する案件では、無理に自前ロジックを組まず、この組込関数を活用してください。可読性が向上し、保守コストを大幅に削減できます。

コメント

タイトルとURLをコピーしました