【COBOL学習|実務向け】DATE-OF-INTEGER関数で実現する「通日」から「年月日」へのスマートな変換術

1. 導入: なぜこの関数が重要なのか

COBOLでの日付計算において、最も頭を悩ませるのが「月末処理」や「経過日数の計算」です。単純に年月日に数値を足しても、うるう年や月ごとの日数の違いで計算が狂ってしまいます。そこで不可欠なのが、日付を一度「1601年1月1日からの通日(整数)」に変換してから計算し、最後に再び「YYYYMMDD形式」に戻すという手法です。この「戻す」処理を担うのがDATE-OF-INTEGER関数です。

2. 基礎知識: 通日変換の仕組み

COBOLの組込関数であるDATE-OF-INTEGERは、入力された整数値を「1601年1月1日を1日目とした経過日数」と解釈し、それをグレゴリオ暦のYYYYMMDD形式の数値として返します。
対になる関数はINTEGER-OF-DATEです。計算プロセスは「日付A → 整数A」「日付B → 整数B」「差分を計算」「整数C → 日付C」という流れが定石です。

3. 実装/解決策: 変換のワークフロー

実務では、まず計算対象の日付をINTEGER-OF-DATE関数で整数化し、必要な加減算(例:30日後の日付を求めるなど)を行った後、DATE-OF-INTEGER関数で元の形式に戻します。このとき、計算結果が8桁の数値として返されることを意識してください。

4. サンプルプログラム: 30日後の日付を求める

IDENTIFICATION DIVISION.
PROGRAM-ID. DATE-CALC-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
01 WS-DATE-IN PIC X(8) VALUE ‘20231025’.
01 WS-INTEGER PIC 9(9).
01 WS-RESULT-INT PIC 9(9).
01 WS-RESULT-YMD PIC 9(8).

PROCEDURE DIVISION.
MAIN-PROCEDURE.

  • 1. YYYYMMDD形式を整数(通日)に変換

COMPUTE WS-INTEGER = FUNCTION INTEGER-OF-DATE(WS-DATE-IN).

  • 2. 30日を加算(ここで単純な足し算が可能になる)

COMPUTE WS-RESULT-INT = WS-INTEGER + 30.

  • 3. 整数(通日)をYYYYMMDD形式に変換

COMPUTE WS-RESULT-YMD = FUNCTION DATE-OF-INTEGER(WS-RESULT-INT).

  • 結果表示

DISPLAY ‘元の日付: ‘ WS-DATE-IN.
DISPLAY ’30日後 : ‘ WS-RESULT-YMD.

GOBACK.

5. 応用・注意点: 現場での落とし穴

注意点1: 入力値の妥当性
DATE-OF-INTEGERに渡す数値が、1601年1月1日以降の正当な値であることを確認してください。負の値や異常な数値が入ると、コンパイラや実行環境によって予期せぬ結果を招く可能性があります。

注意点2: 日付形式の統一
INTEGER-OF-DATE関数は、入力が「YYYYMMDD」形式であることを前提としています。もし入力データが「YYMMDD」のような2桁年号の場合は、事前に世紀を含めた8桁への補正処理を忘れないようにしてください。

応用テクニック: 月末判定
特定の月の翌月末を求めたい場合、「その月の1日」を整数化し、あえて「60日加算」して日付を求めた後、その結果の「日(下2桁)」を01に書き換えてから再びINTEGER-OF-DATEに戻すといったテクニックも非常に有効です。実務ではぜひ活用してください。

コメント

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