【COBOL学習|豆知識】意外と知らない?COBOLで日付計算を劇的に楽にする「INTEGER-OF-DATE」活用術

導入:日付計算の「面倒くさい」を解消する

現場の皆様、お疲れ様です。COBOLでの業務システム開発において、避けて通れないのが「日付計算」です。「ある日付から何日後か」「2つの日付の間は何日あるか」を求める際、うるう年や月ごとの日数を考慮して自前でロジックを組んでいませんか?実は、その苦労は全て「組込関数」で解決できます。今回は、日付計算の要である「INTEGER-OF-DATE」について解説します。

基礎知識:通日(整数)への変換とは

COBOLの「INTEGER-OF-DATE」関数は、YYYYMMDD形式の日付を、1600年12月31日を1とした「通日(整数値)」に変換する関数です。
なぜ整数化するのか?それは、日付のままでは加減算ができないからです。整数に変換してしまえば、ただの算術演算として扱えるため、複雑な日付ロジックをシンプルに記述できるようになります。

実装・解決策:差分計算のベストプラクティス

2つの日付間の日数を求める場合、単純に引き算を行うだけでは、日付の前後関係によってマイナス値が出る可能性があります。そのため、関数で整数化した後に「ABS関数(絶対値)」を組み合わせるのが定石です。

サンプルプログラム

以下のプログラムは、2つの日付の間の日数を算出する実用的なコードです。

IDENTIFICATION DIVISION.
PROGRAM-ID. DATE-CALC-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATE-1      PIC X(08) VALUE '20230101'.
01 WS-DATE-2      PIC X(08) VALUE '20231231'.
01 WS-INT-1       PIC 9(09).
01 WS-INT-2       PIC 9(09).
01 WS-DIFF-DAYS   PIC 9(09).

PROCEDURE DIVISION.
    > 1. 日付を整数値(通日)に変換
    COMPUTE WS-INT-1 = FUNCTION INTEGER-OF-DATE(WS-DATE-1).
    COMPUTE WS-INT-2 = FUNCTION INTEGER-OF-DATE(WS-DATE-2).

    > 2. 差分を計算し、ABS関数で絶対値を取得する
    COMPUTE WS-DIFF-DAYS = FUNCTION ABS(WS-INT-1 - WS-INT-2).

    DISPLAY '開始日: ' WS-DATE-1
    DISPLAY '終了日: ' WS-DATE-2
    DISPLAY '経過日数: ' WS-DIFF-DAYS '日'

    GOBACK.

応用・注意点:現場でのトラブル回避

最後に、現場で役立つ注意点を2つお伝えします。

1. 入力データの形式チェック:INTEGER-OF-DATEの引数は、必ずYYYYMMDD形式である必要があります。桁数が足りなかったり、不正な日付(20230230など)が混入したりすると、実行時エラーや意図しない結果を招く可能性があります。関数を呼び出す前に、数値チェックを必ず行ってください。
2. 逆変換も忘れずに:計算した整数値を再び日付に戻したい場合は、「DATE-OF-INTEGER」関数を使用します。これを使えば、計算結果の日付を画面表示用やDB更新用の形式に簡単に戻すことができます。

日付計算はバグの温床になりやすい箇所です。ぜひ標準関数をフル活用して、保守性の高いコードを書いていきましょう!

コメント

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