適材適所

WindowsやPowerShellやネットワーク、IBMなどのシステム系の話やポイ活など気になったことも載せているブログです。

【Db2 AS400】SQLで日付を扱う

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