【问题标题】:Using bigint datetimes to select records older than X days使用 bigint datetimes 选择早于 X 天的记录
【发布时间】:2011-12-06 15:03:38
【问题描述】:

我的表中存储为 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')

据我了解,它将 bigint mytstamp 字段转换为时间戳,以便将其与“30 天前”时间戳进行比较。它对表中的每条记录执行此操作 :(。将当前时间戳 - 30 天转换为一次 bigint 似乎更有效,然后将其与我所有的 bigint 日期进行比较。

我的 SQL 技能很弱,所以放轻松 :)。感谢您的帮助。

【问题讨论】:

    标签: sql postgresql timestamp bigint


    【解决方案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 进行一次计算,或者对每个记录进行比较。

    【讨论】:

    • CURRENT_TIMESTAMP 和计算都是确定性的; PostgreSQL 应该计算一次。 (CURRENT_TIMESTAMP 是当前事务开始时服务器的时间。)Other time functions 的行为可能不同。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-17
    • 1970-01-01
    • 2022-07-20
    • 1970-01-01
    • 1970-01-01
    • 2014-12-17
    • 1970-01-01
    相关资源
    最近更新 更多