10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

Db2でTIMESTAMP⇔文字列変換 & TIMESTAMPの算術計算

Last updated at Posted at 2018-12-31

通算10000回は調べているので、いい加減にまとめておきます(大げさ)。なお以下のSQLはDb2 on Cloudで稼働確認を行いました。おそらくDb2 LUW V10.5やV11でも動くと思います。zOSはわかりません(´・ω・`)

TIMESTAMP→文字列

まずtimestampから文字列に変換する場合はVARCHAR_FORMATもしくはTO_CHARを利用します。フォーマット指定子は以下に示すVARCHAR_FORMATのIBM Knowledge Centerに一覧が記載されています。

例えば以下の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に記載されています。

以下に示す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
10
6
0

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
10
6

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?