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.
- 日付計算用のワーク
5. 応用・注意点:現場で陥りやすい罠
・入力形式の厳密性
INTEGER-OF-DAYの引数は、必ず「西暦4桁+その年の経過日数3桁」である必要があります。月・日(MMDD)のまま渡すとエラーになるか、意図しない値になります。必ず日付編集用ルーチンでYYYYDDD形式に変換してから渡すようにしてください。
・うるう年の意識不要
この関数の最大のメリットは、うるう年を考慮する必要がない点です。2月28日の翌日が2月29日になるか3月1日になるか、といった判定ロジックを自分で書く必要はありません。全て内部の整数値計算で自動的に処理されます。
・まとめ
日付の比較や差分計算が発生する案件では、無理に自前ロジックを組まず、この組込関数を活用してください。可読性が向上し、保守コストを大幅に削減できます。

コメント