@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よりわずかに高速です 。