ピッシーのメモ帳

気になった情報の保管庫

IBM i (AS/400)のRPGで6桁の日付を8桁に変換する

IBM i (AS/400)の物理ファイルには日付型のフィールドはないので、日付は数値フィールドに保存していることが多いだろう。また、日付は「250131」のように6桁のYYMMDD形式か、「20250131」のように8桁のYYYYMMDD形式のどちらかで保存していることが多いだろう。

この記事では、6桁の日付を8桁に変換する方法を紹介する。なお、この方法はRPGⅢでは使えないので注意。

変換例

6桁の数値フィールド「DATE6」の日付を8桁の数値フィールド「DATE8」に入れるには、以下のように書く。

DATE8 = %DEC(%DATE(DATE6:*YMD))

解説

%DATE関数と%DEC関数を使用する。

%DATE関数

%DATE関数を使うと、数値や文字を日付に変換できる。数値フィールド「DATE6」を*YMD形式の日付に変換するには、以下のようにコロンの後に*YMDと書く。

%DATE(DATE6:*YMD)

例えばDATE6の値が「250131」だと、「2025-01-31」と変換される。確かにこれで8桁に変換できたが、これは数値ではないので数値フィールドに入れることはできない。

%DEC関数

%DEC関数を使うと、日付を数値に変換できる。

%DEC(%DATE(DATE6:*YMD))

余談

6桁の日付を8桁に変換する際に、「6桁の日付に20000000を足して8桁にする」というかなり強引なやり方をしているプログラムをよく見かけた。これが一般的なのかどうかは全然分からないが…。

参考文献

この記事の内容は、以下の公式サイトを参考にした。

%DATE関数

www.ibm.com

%DEC関数

www.ibm.com