1. 導入:なぜ曜日判定が重要なのか
COBOLでの開発現場において、日付の扱いは避けて通れない関門です。特に「特定の日付が何曜日か」を算出する処理は、バッチ処理のスケジュール管理や、帳票出力時の日付印字など、あらゆるビジネスロジックで必要とされます。昔は複雑な計算式を自作して曜日を求めていましたが、今は「組込関数」を使うのが定石です。今回は、コードの可読性を高め、バグを減らすための強力な武器「DAY-OF-WEEK関数」について解説します。
2. 基礎知識:DAY-OF-WEEK関数とは
DAY-OF-WEEK関数は、日付データを「曜日を表す数値」に変換する関数です。
この関数の最大の特徴は、戻り値が「1(月曜日)」から「7(日曜日)」である点です。
注意が必要なのは、この関数は「通日(整数形式の日付)」を引数に取るという点です。そのため、通常使われる「YYYYMMDD」形式の日付を、一度「INTEGER-OF-DATE関数」で通日に変換してから渡すという「合わせ技」が基本となります。
3. 実装のステップ
曜日を求めたい日付(YYYYMMDD形式)がある場合、以下の手順で処理を行います。
1. 日付文字列を整数型に変換する(INTEGER-OF-DATE関数を使用)。
2. その値をDAY-OF-WEEK関数に渡す。
3. 返ってきた数値(1〜7)を判定して、業務ロジックに組み込む。
この手順を踏むことで、複雑なうるう年の計算などを気にすることなく、正確に曜日を特定できます。
4. サンプルプログラム
以下のコードは、指定した日付の曜日を判定し、表示する例です。そのままコピー&ペーストして動作を確認してみてください。
IDENTIFICATION DIVISION.
PROGRAM-ID. DOW-SAMPLE.
DATA DIVISION.
WORKING-STORAGE SECTION.
- 日付データ(YYYYMMDD)
01 WS-DATE-STR PIC X(08) VALUE ‘20231027’.
- 曜日番号格納用
01 WS-DOW PIC 9(01).
PROCEDURE DIVISION.
> 関数を組み合わせて曜日を取得
> INTEGER-OF-DATEで日付を整数に変換し、DAY-OF-WEEKで曜日数値を得る
COMPUTE WS-DOW = FUNCTION DAY-OF-WEEK(FUNCTION INTEGER-OF-DATE(WS-DATE-STR))
> 曜日番号に応じた処理
EVALUATE WS-DOW
WHEN 1 DISPLAY ‘月曜日です’
WHEN 2 DISPLAY ‘火曜日です’
WHEN 3 DISPLAY ‘水曜日です’
WHEN 4 DISPLAY ‘木曜日です’
WHEN 5 DISPLAY ‘金曜日です’
WHEN 6 DISPLAY ‘土曜日です’
WHEN 7 DISPLAY ‘日曜日です’
END-EVALUATE.
GOBACK.
5. 応用・注意点:現場で役立つアドバイス
注意点1:数値の意味を忘れないこと
多くの人が「日曜が1」と勘違いしがちですが、COBOLのこの関数は「月曜が1」です。EVALUATE文を書く際は、この定義を必ずコメントに残すようにしましょう。
注意点2:日付の正当性チェック
関数に渡す日付が「13月」や「32日」など、日付として無効な値の場合、プログラムが異常終了したり予期せぬ結果を招く可能性があります。関数を呼び出す前に、必ず「DATE-OF-INTEGER関数」との逆変換や、範囲チェックを行う習慣をつけると、堅牢なシステムになります。
現場では、このように標準関数を組み合わせることで、メンテナンス性の高いコードを書くことが評価されます。ぜひ活用してみてください。

コメント