sql >> データベース >  >> RDS >> PostgreSQL

今日の(深夜以降の)タイムスタンプのみを選択します

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



    1. OracleEXPAND_SQL_TEXTの使用

    2. T-SQLを使用して「サーバーがRPC用に構成されていない」メッセージ7411を修正する方法

    3. MySQLデータベースのすべてのテーブルのフィールドでテキストを検索する

    4. ORA-00907:右括弧がありません