3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ILERPGAdvent Calendar 2024

Day 16

IBM i あるあるSQL(数値型の日付時刻)

Last updated at Posted at 2024-12-15

IBM iの日付、時刻のデータベース表現

IBM i のデータベースはとても歴史があり、かなり古い時代から使用されています。最近(特にモダンなアプリを制作するケースや外部連携)では、IBM i データベースのフィールド型に日付型/日時型を使用することも増えてきましたが、日付や時刻を表すのに根強く残っているのは以下の様な数値型を使用するケースです。

  • 年月:6S 0※S:ゾーン10進数
  • 日付:8S 0
  • 時刻:6S 0

IBM iにおいてモダンなアプリ開発を行う際に、それらフィールドを含むデータベースを使用している時、日付算術等でよく使う SQL を今回はご紹介します。

年月:6S 0 から8S 0の1日を取得する

これはとても簡単で桁上げして、1を加算するだけです。
以下の SQL になります。

数値年月から数値1日を取得する
SELECT
 (YM01 * 100 + 01) AS DT01
 FROM
   ( SELECT 202412 AS YM01
       FROM SYSIBM.SYSDUMMY1  )
;

2024-11-30_123940.png

年月:6S 0 からD 日付型の1日を取得する

少し複雑ですが、日付型へ変換(キャスト)するために DATE関数 を使用します。日付型へのキャストには区切記号 - で区切必要があるので SUBSTR関数 で必要桁数に区切っています。
以下の SQL になります。

数値年月から日付型1日を取得する
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  )
  )       
;

2024-11-30_124644.png

年月: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  )
;

2024-11-30_130516.png

おまけ - 今日の:日付型を取得する

今日を取得するには、特殊レジスタ CURRENT DATE を使う事ができます。
以下の SQL になります。

今日の日付を取得する
SELECT
 CURRENT DATE AS DT10
  FROM SYSIBM.SYSDUMMY1
;

2024-11-30_125753.png

これを、数値型へキャストすれば数値型のシステム日付を取得できます。
IBM i では結構この様な RPG,CL で当たり前にやってることが 「SQL ではどうすんの?」系は多くあります。また機会があったら別のケースも紹介します。

3
0
4

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?