2011年4月5日火曜日

PostgreSQLで日付や日時の差を計算する

PostgreSQLでは単純に引き算すれば日付間の差を取得できる。

SELECT '2011-12-31 23:59:59' - TIMESTAMP '2011-01-01 00:00:00' -- => "364 days 23:59:59"
結果はInterval型になる。

もちろん普通の日付型や日時型の列でもOK。
SELECT updated_at - created_at



条件として使う

条件として判定したい場合は下記のように文字列と比較できる。
SELECT '2011-12-31 23:59:59' - TIMESTAMP '2011-01-01 00:00:00' > '300 days' -- => TRUE
SELECT '2011-01-31 23:59:59' - TIMESTAMP '2011-01-01 00:00:00' > '300 days' -- => FALSE
SELECT '2012-12-31 23:59:59' - TIMESTAMP '2011-01-01 00:00:00' > '1 year' -- => TRUE
左辺を考慮して'300 days'のような文字列はInterval型にCASTして比較してくれる。
もちろWHERE句でも使える。



注意点

DATE型とDATE型の引き算の場合は結果がInterval型ではなく、日数を表すInteger型になる。
SELECT '2011-12-31' - DATE '2011-01-01' -- => 364
これを条件として判定したい場合は、'300 days'のような文字列(あるいはInterval型)ではなく、素直に数値で判定するか、あるいはTIMESTAMP型にCASTにする。
-- 数値で判定
SELECT '2011-12-31' - DATE '2011-01-01' > 300

-- TIMESTAMP型にCAST
SELECT '2011-12-31' - TIMESTAMP '2011-01-01' > '300 days'



参考:日付/時刻関数と演算子 (PostgreSQLマニュアル)

2 件のコメント:

Rubens Takiguti Ribeiro さんのコメント...

Congratulations. You have a nice PHP blog. I do not understand japanese, but I can understand your code.

匿名 さんのコメント...

わかりにくい

ブログ アーカイブ

tags