PostgreSQLでDATE型のフィールドにnow()でSELECTする時の注意


データベースのデータを抽出する際、今現在有効なデータを取得するというケースは多々あるかとっ。
そこで、now()を用いて取得すると、思ってたのと少し違う挙動をしちゃいます。



PostgreSQLのデータベースに、「start_date」「end_date」という共にDATE型のフィールドを持つテーブル「hoge」があるとします。


hoge
id start_date end_date
1 2010-5-1 2010-5-11
2 2010-5-12 2010-5-31
そのテーブルに対してデータを取得しようとし、
SELECT *
FROM hoge
WHERE
start_date <= now() AND
end_date >= now()

としてクエリを投げます、今日は2010年5月11日です。
そうしたとき、[id:1]が返ってくるのを期待するのですが、実際はどっちも返ってきません。
ぱっと見、[id:1]のend_dateにぎりぎり入っていると思うんですけどね?

ですが、PostgreSQLはDATE型と比較する際に、内部的にはタイムスタンプで比較していて、

’2010-5-11 00:00:00′ >= ’2010-5-11 23:32:00′

のようになることで、[id:1]が返ってこないのかなーと。

DATE型を比較する時は

  end_date >= TO_CHAR(now(), ‘YYYY-MM-DD’)
又は
  end_date >= CAST(now(), AS DATE)

のようにDATE型にあう文字列にしてあげるか、CASTするかしてあげる必要があるようです。
ご注意をば。

コメントを残す