@Frankのコメントに触発されて、私はいくつかのテストを実行し、それに応じてクエリを適応させました。これは、1)正しく、2)できるだけ速くする必要があります:
SELECT u.login, u.id, u.first_name
FROM pref_users u
WHERE u.login > u.logout
AND u.login >= now()::date + interval '1h'
ORDER BY u.login;
テーブルには将来のタイムスタンプがないため(私は推測します)、上限は必要ありません。
date_trunc('day', now())
now()::date
とほぼ同じです (または以下に詳述する他のいくつかの代替案)、それがtimestamp
を返すことだけ date
の代わりに 。どちらもtimestamp
になります とにかくinterval
を追加した後 。
以下の式のパフォーマンスは少し異なります。 localtimestamp
のため、結果は微妙に異なります。 データ型timestamp
を返します now()
timestamp with time zone
を返します 。ただし、date
にキャストすると 、どちらも同じローカルに変換されます 日付、およびtimestamp [without time zone]
現地のタイムゾーンにもあると推定されます。したがって、対応するtimestamp with time zone
と比較すると それらはすべて、内部的に同じUTCタイムスタンプになります。この関連する質問でのタイムゾーン処理の詳細。
5つのベスト。 PostgreSQL9.0でテスト済み。 9.1.5で繰り返されます:1%の許容誤差内で一貫した結果。
SELECT localtimestamp::date + interval '1h' -- Total runtime: 351.688 ms
, current_date + interval '1h' -- Total runtime: 338.975 ms
, date_trunc('day', now()) + interval '1h' -- Total runtime: 333.032 ms
, now()::date + interval '1h' -- Total runtime: 278.269 ms
FROM generate_series (1, 100000)
now()::date
明らかにCURRENT_DATE
よりわずかに高速です 。