0

テーブルに bigint として保存されている日付があり、30 日より古いレコードを選択しようとしています。この質問に関連する SO と Google でたくさんの質問を見てきましたが、必要なものが見つかりません。

これは私が持っているもので、非常に非効率的です:

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

私が理解していることから、bigintmytstampフィールドをタイムスタンプに変換して、「30 日前」のタイムスタンプと比較しています。テーブル内のすべてのレコードに対してこれを行います:(。現在のタイムスタンプ-30日をbigint ONE TIMEに変換し、それをすべてのbigint日付と比較する方が効率的です。

私のSQLスキルは弱いので、簡単に行ってください:)。助けてくれてありがとう。

4

1 に答える 1

1

SOに投稿した直後に解決策を見つけました。幸運のお守りだと思います。とにかく、これは私が探しているもののようで、はるかに効率的です:

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

extract('epoch' from (CURRENT_TIMESTAMP - INTERVAL '10 days'))::bigintpostgres が1 回だけ計算を行うのか、それともすべてのレコード比較に対して計算を行うのか疑問に思っています。

于 2011-12-06T17:29:57.327 に答える