IBM iの日付、時刻のデータベース表現
IBM i のデータベースはとても歴史があり、かなり古い時代から使用されています。最近(特にモダンなアプリを制作するケースや外部連携)では、IBM i データベースのフィールド型に日付型/日時型を使用することも増えてきましたが、日付や時刻を表すのに根強く残っているのは以下の様な数値型を使用するケースです。
- 年月:
6S 0
※S:ゾーン10進数 - 日付:
8S 0
- 時刻:
6S 0
IBM iにおいてモダンなアプリ開発を行う際に、それらフィールドを含むデータベースを使用している時、日付算術等でよく使う SQL を今回はご紹介します。
年月:6S 0
から8S 0
の1日を取得する
これはとても簡単で桁上げして、1を加算するだけです。
以下の SQL になります。
SELECT
(YM01 * 100 + 01) AS DT01
FROM
( SELECT 202412 AS YM01
FROM SYSIBM.SYSDUMMY1 )
;
年月:6S 0
からD 日付型
の1日を取得する
少し複雑ですが、日付型へ変換(キャスト)するために DATE関数
を使用します。日付型へのキャストには区切記号 -
で区切必要があるので SUBSTR関数
で必要桁数に区切っています。
以下の SQL になります。
SELECT
DATE(SUBSTR(DT01 ,1,4)
|| '-' || SUBSTR(DT01 ,5,2)
|| '-' || SUBSTR(DT01 ,7,2)
) AS DT10
FROM
( SELECT
(YM01 * 100 + 01) AS DT01
FROM
( SELECT 202412 AS YM01
FROM SYSIBM.SYSDUMMY1 )
)
;
年月:6S 0
から8S 0
の末日を取得する
末日を取得するには LAST_DAY
関数を使うことができます。一旦日付型形式の”1日”を作成します。その後、LAST_DAY
関数を通し末日の日付型を取得したら CHAR
関数で文字列へキャストします。REPLACE
関数を使い区切記号 -
を除去し、DECIMAL
関数で10進数へキャストすれば、数値8桁の末日が取得できます。
以下の SQL になります。
SELECT
DECIMAL(REPLACE(CHAR(LAST_DAY(SUBSTR(YM01, 1, 4)
|| '-' || SUBSTR(YM01, 5, 2) || '-01')), '-', '')) AS DT01
FROM
( SELECT 202502 AS YM01
FROM SYSIBM.SYSDUMMY1 )
;
おまけ - 今日の:日付型
を取得する
今日を取得するには、特殊レジスタ CURRENT DATE
を使う事ができます。
以下の SQL になります。
SELECT
CURRENT DATE AS DT10
FROM SYSIBM.SYSDUMMY1
;
これを、数値型へキャストすれば数値型のシステム日付を取得できます。
IBM i では結構この様な RPG,CL で当たり前にやってることが 「SQL ではどうすんの?」系は多くあります。また機会があったら別のケースも紹介します。