適材適所

PowerShellを中心にプログラミングやシステム管理の備忘録的なブログ

【Db2 AS400】SQLで日付を扱う

f:id:shinmai_papa:20220128092919p:plain

AS400(System i)のDb2で日付を扱うときのまとめです。

今現在の日付を単純に出力する

今現在の日付を出力するときは、

CURRENT DATEという特殊レジスターを使います。

 
SELECT CURRENT DATE FROM SYSIBM.SYSDUMMY1

出力結果は次の通りです。

CURRENT DATE  
21/12/13     

また、タイムスタンプを出力するときは同じように CURRENT TIMESTAMPを使います。

 
SELECT CURRENT TIMESTAMP FROM SYSIBM.SYSDUMMY1

出力結果

CURRENT TIMESTAMP             
2021-12-13-10.15.10.845724     

タイムスタンプの精度を指定する

タイムスタンプの精度を指定したいときは、

CURRENT TIMESTAMP(精度)

0~12までの精度指定することできます。

数字が小さいほうが荒く、

数字が大きいほうが細かい精度になります。

デフォルトの精度は6になります。

 
SELECT 
   CURRENT TIMESTAMP(0) MIN,
   CURRENT TIMESTAMP DEFAULT,
   CURRENT TIMESTAMP(12) MAX
FROM SYSIBM.SYSDUMMY1 
MIN                  DEFAULT                     MAX                              
2021-12-13-17.28.48  2021-12-13-17.28.48.438198  2021-12-13-17.28.48.438198303710

文字列から日付を取得する

文字列を日付に変換して取得することも簡単にできます。

DATE関数

DATE関数を使うことで文字列をDATE型の日付に変換することができます。

 
SELECT  DATE('2021-12-13') FROM SYSIBM.SYSDUMMY1 
DATE   
21/12/13

DATE関数で変換できる日付の文字列表現は下記を参照ください。

日付/時刻の値 - IBM DB2 9.7 for Linux, UNIX, and Windows

TO_DATE関数

TO_DATE関数を使うと、

DATE関数よりも柔軟に文字列を日付に変換できます。

ただ戻り値はタイムスタンプ型なので、

単純な日付に変換するときは

上述のDATE関数をかませる必要があります。

 
SELECT  DATE(TO_DATE('20211213','YYYYMMDD')) FROM SYSIBM.SYSDUMMY1               
DATE      
21/12/13

TO_DATE関数で使用可能な文字列表現は下記をご参照ください。

TIMESTAMP_FORMAT - IBM DB2 9.7 for Linux, UNIX, and Windows

日付の加減

日付の加減も簡単にできます。

1か月後

 
SELECT CURRENT TIMESTAMP + 1 MONTHS  FROM SYSIBM.SYSDUMMY1

1年後

 
SELECT CURRENT TIMESTAMP + 1 YEARS   FROM SYSIBM.SYSDUMMY1

1週間前

 
SELECT CURRENT DATE -7 DAYS  FROM SYSIBM.SYSDUMMY1

日付をYYYYMMDD形式に変換する

よく使われるであろう(?)

YYYYMMDD形式の文字列を作るときは

TO_CHAR関数を使います。

 
SELECT TO_CHAR(CURRENT DATE, 'YYYYMMDD') FROM SYSIBM.SYSDUMMY1
TO_CHAR   
20211213

月初、月末の取得

月初

月初の日付を求めたいときは、Db2のバージョン11.1以降であれば

FIRST_DAY関数が使えます。

 
SELECT FIRST_DAY(CURRENT DATE) FROM SYSIBM.SYSDUMMY1
FIRST_DAY
21/12/01

バージョンが古くてFIRST_DAY関数を使えないときは

力づくで求めましょう。

 
SELECT                                                    
  DATE(YEAR(CURRENT DATE)||'-'||MONTH(CURRENT DATE)||'-'||1)
FROM SYSIBM.SYSDUMMY1                                     
DATE     
21/12/01

月末

月末はLAST_DAY関数が使えます。

こちらは最古のバージョンは確認できませんでしたが、

FIRST_DAY関数よりは昔からあるようです。

 
SELECT LAST_DAY(CURRENT DATE) FROM SYSIBM.SYSDUMMY1
DATE     
21/12/31

終わりに

Db2における日付の扱い方についてのまとめでした。

データベース操作において日付操作は頻出なので、

他のRDBMSと遜色なく日付操作を行えるDb2に圧倒的感謝・・・!

というわけで、ここまでお読み頂きありがとうございました。

参考

特殊レジスター

日付/時刻の値 - IBM DB2 9.7 for Linux, UNIX, and Windows

DATE - IBM DB2 9.7 for Linux, UNIX, and Windows

FIRST_DAY

LAST_DAY