1. 導入:なぜ日付計算でつまずくのか
業務システムにおいて、日付の加減算は避けて通れない処理です。しかし、うるう年や月ごとの日数の違いを自前で実装しようとすると、バグの温床になりがちです。COBOLの組込関数であるINTEGER-OF-DATEを使えば、特定の日付を「1601年1月1日からの経過日数(整数)」に変換でき、日付計算を単純な数値演算として扱うことが可能になります。この仕組みを理解することは、複雑なロジックを簡潔かつ正確に記述するために極めて重要です。
2. 基礎知識:1601年1月1日の謎
なぜ、あえて1601年なのでしょうか。その理由は、グレゴリオ暦の運用の安定性にあります。グレゴリオ暦では「400年間に97回のうるう年がある」というルールが適用されますが、1601年はその400年周期の計算開始地点として扱いやすく、過去の歴史的な日付との整合性も取りやすいため採用されています。この関数は、YYYYMMDD形式の日付を、この基準日から数えた「整数値」に変換します。
3. 実装・解決策
日付の計算を行いたい場合、以下の手順を踏みます。
1. 日付AをINTEGER-OF-DATEで数値に変換。
2. 日付BをINTEGER-OF-DATEで数値に変換。
3. 数値の差を求める(これが経過日数となります)。
4. 逆に数値を日付に戻したい場合は、DATE-OF-INTEGER関数を使用します。
4. サンプルプログラム
以下は、今日の日付から10日後の日付を求めるプログラム例です。
IDENTIFICATION DIVISION.
PROGRAM-ID. DATE-CALC-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 CURRENT-DATE-VAL PIC X(8) VALUE ‘20231001’.
01 INTEGER-VAL PIC 9(9).
01 RESULT-VAL PIC 9(9).
01 NEW-DATE PIC X(8).
PROCEDURE DIVISION.
MAIN-LOGIC.
- 日付を整数値に変換
COMPUTE INTEGER-VAL = FUNCTION INTEGER-OF-DATE(CURRENT-DATE-VAL)
- 10日を加算
COMPUTE RESULT-VAL = INTEGER-VAL + 10
- 計算後の整数を日付形式に戻す
COMPUTE NEW-DATE = FUNCTION DATE-OF-INTEGER(RESULT-VAL)
DISPLAY ‘基準日: ‘ CURRENT-DATE-VAL
DISPLAY ’10日後の日付: ‘ NEW-DATE
GOBACK.
5. 応用・注意点
現場で注意すべきは、「入力データの妥当性」です。INTEGER-OF-DATEに不正な日付(例えば20231345など)を渡すと、プログラムが異常終了したり、意図しない値が返ったりすることがあります。関数を通す前に、必ずTEST-DATE-YYYYMMDD関数などで日付が正しい形式であるかチェックする癖をつけましょう。また、古い汎用機環境では関数の有効範囲や桁数制限がある場合があるため、使用するコンパイラの仕様書(マニュアル)を一度確認することをお勧めします。

コメント