日付の足し引き

普段、SQL Server 2000を主に使っているので、DB2でもdateaddみたいな関数でやるのかなぁとSQL本で調べていたら。
「それ、足す1デイでできますよ」と同僚からのお言葉。

DB2

ほんとかそれと思ってやってみたら、出来た。

select
    current timestamp as current,
    current timestamp + 1 year as 年,
    current timestamp + 1 month as 月,
    current timestamp + 1 day as 日,
    current timestamp + 1 hour as 時,
    current timestamp + 1 minutes as 分,
    current timestamp + 1 second as 秒,
    current timestamp + 1 year + 1 month + 1 day + 1 hour + 1 minutes + 1 second as 年月日時分秒
from
    sysibm.sysdummy1
年月日時分秒
2007-05-28 17:00:38.337768 2008-05-28 17:00:38.337768 2007-06-28 17:00:38.337768 2007-05-29 17:00:38.337768 2007-05-28 18:00:38.337768 2007-05-28 17:01:38.337768 2007-05-28 17:00:39.337768 2008-06-29 18:01:39.337768


少なからずショック。できるのか。そんなことが。


IBMさんのサイトにも載ってた。。
http://www-06.ibm.com/jp/software/data/developer/library/techdoc/daytime.html

SQL Server 2000で

ものは試しと、SQL Serverでやってみた。


ら、SQLエラー。

select
    current_timestamp as 今,
    current_timestamp + 1 year as 年,
    current_timestamp + 1 month as 月,
    current_timestamp + 1 day as 日,
    current_timestamp + 1 hour as 時,
    current_timestamp + 1 minutes as 分,
    current_timestamp + 1 second as 秒

↑これはエラー(キーワード 'as' 付近に正しくない構文があります。)


さらにものは試しと、asを取ってみた。

select
    current_timestamp as 今,
    current_timestamp + 1 year ,
    current_timestamp + 1 month ,
    current_timestamp + 1 day ,
    current_timestamp + 1 hour ,
    current_timestamp + 1 minutes ,
    current_timestamp + 1 second 

今度はエラーが出なかったものの、全部「日」だけ1日加算。
どうやら、yearとかmonthとかは無視で、+1だけ有効になっているっぽい。


じゃぁ、その1って何だということで、

select
    current_timestamp as 今,
    current_timestamp + 1 as [1] ,
    current_timestamp + 0.1 as [0.1] ,
    current_timestamp + 0.01 as [0.01] ,
    current_timestamp + 0.001 as [0.001]

とやってみたら予想外の結果。

[1] [0.1] [0.01] [0.001]
2007-05-28 17:23:20.183 2007-05-29 17:23:20.183 2007-05-28 19:47:20.183 2007-05-28 17:37:44.183 2007-05-28 17:24:46.583


日が基準なのかぁーと予想されたので、24で割れば時間を加減できるかなと

select
    current_timestamp as 今,
    current_timestamp + 1 as [1],
    current_timestamp + 1.0/24 as [1.0/24],
    current_timestamp + 2.0/24 as [2.0/24],
    current_timestamp + 3.0/24 as [3.0/24],
    current_timestamp + 4.0/24 as [4.0/24]

とやってみたら、だいたい予想通りの結果。

1 1.0/24 2.0/24 3.0/24 4.0/24
2007-05-28 17:36:46.110 2007-05-29 17:36:46.110 2007-05-28 18:36:46.050 2007-05-28 19:36:46.080 2007-05-28 20:36:46.110 2007-05-28 21:36:46.050


※割る方か割られる方を小数ありにしておかないと、計算結果0になって加減されないです。


すっきり。
※正確じゃないので、SQL Server だったらdateaddした方がいいと思います。