【问题标题】:select query to fetch data exactly before 3 days with timestamp选择查询以在 3 天之前获取带有时间戳的数据
【发布时间】:2017-10-08 18:45:24
【问题描述】:

我有创建时间戳列的数据库表。我想从 postgress 数据库中获取所有记录,这些记录是在当前时间戳前 3 天创建的。但这里的另一个约束是另一个名为 status 的列。可能有多个状态并创建时间戳,因为 PK 是时间戳、状态和 id。我只想获取在当前时间戳前 3 天最后插入的那些 id。 例如:

-----id------------timestamp--------------------------status------------col3------
.....111...............2017-10-05 10:42:23..............A..........
.....111...............2017-10-05 12:42:23..............X..........
.....111...............2017-10-05 18:42:23..............X..........   
.....222...............2017-10-05 11:42:23..............A..........
.....222...............2017-10-05 13:42:23..............X..........

.....222...............2017-10-07 18:42:23..............X..........   

id 111 是我想要获取的,因为最后一条记录是在当前时间戳前 3 天插入的,但 222 不是我希望选择的记录,因为最后一个条目是在当前时间戳前一天插入的222 的第一条记录是在 3 天前插入的。 抱歉,我无法在这里画出合适的表格

【问题讨论】:

  • 您没有说明“正好 3 天前”是什么意思。我到最接近的微秒?
  • 如果当前时间戳是 2017-10-08 19:42:23 那么 3 天前意味着 2017-10-05 19:42:23

标签: sql postgresql timestamp


【解决方案1】:

只需使用interval 算术:

where created_timestamp < current_timestamp - interval '3 day'

对于修改后的问题,它似乎是这样的:

select id
from t
group by id
having max(timestamp) >= date_trunc('day', current_timestamp - interval '2 day') and
       max(timestamp) < date_trunc('day', current_timestamp - interval '1 day');

这是一个猜测,“正好 3 天前”意味着从那时起已经过去了两个午夜。可以很容易地针对其他定义调整逻辑。

【讨论】:

    【解决方案2】:

    如果您使用 t-sql,您可以在 WHERE 阶段使用以下谓词。

    DATEDIFF(日、列、系统日期)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-10-20
      • 1970-01-01
      • 2019-07-05
      • 2018-04-17
      • 2014-12-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多