2011-12-06 10 views
0

テーブルにbigintとして保存された日付があり、30日以上経過したレコードを選択しようとしています。私はこの質問に関連するSOとGoogleに関する1トンの質問を見ましたが、私は必要なものを見つけることができません。非常に非効率ですbigint datetimesを使用してX日より古いレコードを選択する

私が持っているものHERESに

、:

SELECT 
    COUNT(*) 
FROM 
    alert 
WHERE 
    ('1969-12-31 19:00:00 GMT'::timestamp + (alert.mytstamp::text)::interval) < (localtimestamp - INTERVAL '30 days') 

私が理解から、それは「30日前」のタイムスタンプと比較するために、タイムスタンプにBIGINT mytstampフィールドに変換されます。

私のSQLスキルは弱いですが、それはテーブルのすべてのレコードのためにこれを行います:(私は、だから簡単に行く:)。助けてくれてありがとう。

答えて

1

再び、私はSOに投稿した直後に解決策を見つけました。それは私が推測する幸運の魅力です。とにかく、これは私が探しているものをあるように思われ、はるかに効率的である:

SELECT 
    COUNT(*) 
FROM 
    alert 
WHERE 
    alert.timestamp < extract('epoch' from (CURRENT_TIMESTAMP - INTERVAL '10 days'))::bigint 

Postgresは一度extract('epoch' from (CURRENT_TIMESTAMP - INTERVAL '10 days'))::bigintのための計算を行い、またはけれどもすべてのレコードの比較のためならば、私は思ったんだけど。

+1

CURRENT_TIMESTAMPと計算の両方が確定的です。 PostgreSQLは一度だけ計算します。 (CURRENT_TIMESTAMPは、現在のトランザクションの開始時のサーバーの時刻です。)[その他の時刻関数](http://www.postgresql.org/docs/current/static/functions-datetime.html#FUNCTIONS-DATETIME-CURRENT)は、異なって振る舞う。 –

関連する問題