通算10000回は調べているので、いい加減にまとめておきます(大げさ)。なお以下のSQLはDb2 on Cloudで稼働確認を行いました。おそらくDb2 LUW V10.5やV11でも動くと思います。zOSはわかりません(´・ω・`)
TIMESTAMP→文字列
まずtimestampから文字列に変換する場合はVARCHAR_FORMAT
もしくはTO_CHAR
を利用します。フォーマット指定子は以下に示すVARCHAR_FORMAT
のIBM Knowledge Centerに一覧が記載されています。
-
VARCHAR_FORMAT
: https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007110.html -
TO_CHAR
: https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007108.html
例えば以下の2つのSQLは両方とも2018/12/29 16:52:49
というような結果を返します。
SELECT TO_CHAR(current timestamp, 'YYYY/MM/DD HH24:MI:SS') FROM SYSIBM.SYSDUMMY1;
SELECT VARCHAR_FORMAT(current timestamp, 'YYYY/MM/DD HH24:MI:SS') FROM SYSIBM.SYSDUMMY1;
文字列→TIMESTAMP
次に文字列をパースしてTIMESTAMPに変換したい場合はTIMESTAMP_FORMAT
もしくはTO_DATE
を利用します。第2引数にはフォーマット形式を指定しますが、ここで利用できるフォーマット指定子はTIMESTAMP_FORMAT
のIBM Knowledge Centerに記載されています。
-
TIMESTAMP_FORMAT
: https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007107.html -
TO_DATE
: https://www.ibm.com/support/knowledgecenter/ja/SSEPGG_11.1.0/com.ibm.db2.luw.sql.ref.doc/doc/r0007109.html
以下に示す2つのSQLは2018/12/30
という文字列をTIMESTAMPにパースするサンプルで、どちらも2018-12-30 00:00:00.0
という結果を得ることができるはずです。
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') FROM SYSIBM.SYSDUMMY1;
SELECT TIMESTAMP_FORMAT('2018/12/30', 'YYYY/MM/DD') FROM SYSIBM.SYSDUMMY1;
算術計算
Db2では日付の算術計算をサポートしており、+ 1 hours
などのように「演算子→数値→単位」形式で可能になっています--と書くとややこしいですね(´・ω・`) これについてはサンプルを見てもらったほうが早いと思います。以下のサンプルは2018/12/30に1年・1か月・1日・1時間・1分・1秒をそれぞれ足し算するもので、それぞれのSQLの結果はコメントで示しています。
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 years FROM SYSIBM.SYSDUMMY1; -- 2019-12-30 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 months FROM SYSIBM.SYSDUMMY1; -- 2019-01-30 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 days FROM SYSIBM.SYSDUMMY1; -- 2018-12-31 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 hours FROM SYSIBM.SYSDUMMY1; -- 2018-12-30 01:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 minutes FROM SYSIBM.SYSDUMMY1; -- 2018-12-30 00:01:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 1 seconds FROM SYSIBM.SYSDUMMY1; -- 2018-12-30 00:00:01.0
引き算ももちろん可能です。
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') - 100 years FROM SYSIBM.SYSDUMMY1; -- 1918-12-30 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') - 100 months FROM SYSIBM.SYSDUMMY1; -- 2010-08-30 00:00:00.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') - 100 days FROM SYSIBM.SYSDUMMY1; -- 2018-09-21 00:00:00.0
最後に複数の日時を足したり引いたりする例を示します。結構複雑な計算も可能ですが、ここまでくるとSQLではなくアプリ側で計算したほうがよさそうですね(´・ω・`)
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 10 hours - 10 minutes + 10 seconds FROM SYSIBM.SYSDUMMY1; -- 2018-12-30 09:50:10.0
SELECT TO_DATE('2018/12/30', 'YYYY/MM/DD') + 10 years - 10 months + 10 days FROM SYSIBM.SYSDUMMY1; -- 2028-03-10 00:00:00.0