PostgreSQL查询问题:筛选执行时间前2小时内插入的记录
嘿,我来帮你搞定这个PostgreSQL的时间筛选问题!
首先,核心思路是用查询执行时的动态时间来计算筛选范围,而不是固定值。PostgreSQL里的CURRENT_TIMESTAMP(或者NOW())会返回查询开始执行的时间,完美适配你的需求。
针对你的例子的正确查询
根据你描述的场景:21:15执行查询,要返回20:00和21:00的记录,这说明你需要的是从当前小时的上一个整点开始,往前推1小时的所有记录。对应的SQL是:
SELECT * FROM your_table WHERE created_at >= DATE_TRUNC('hour', CURRENT_TIMESTAMP) - INTERVAL '1 hour';
解释一下:
DATE_TRUNC('hour', CURRENT_TIMESTAMP)会把当前时间截断到小时,21:15执行时就是2018-04-11 21:00:00- 减去
INTERVAL '1 hour'后得到时间下限2018-04-11 20:00:00 - 筛选
created_at >=这个下限,就会包含20:00和21:00的所有记录,正好符合你的预期。
如果你需要严格的「前X小时内」(精确到分钟/秒)
如果你的需求是查询执行时刻往前推X小时内的所有记录(比如21:15执行,要返回20:15之后的记录),那直接用CURRENT_TIMESTAMP计算即可:
SELECT * FROM your_table WHERE created_at >= CURRENT_TIMESTAMP - INTERVAL '1 hour';
把1 hour替换成你需要的时长,比如2 hours 30 minutes这种格式都支持。
可能导致你查询失效的常见错误
- 用了固定时间值:比如手动写死
WHERE created_at >= '2018-04-11 20:00:00',这样每次执行都得修改,完全不符合动态筛选的需求。 - 符号搞反了:误写成
WHERE created_at < CURRENT_TIMESTAMP - INTERVAL '1 hour',这会筛选出X小时之前的旧记录,和你要的结果正好相反。 - 时区不统一:如果你的
created_at字段带时区,而CURRENT_TIMESTAMP的时区和它不一致,可能会出现时间偏差。确保两者时区一致,或者用AT TIME ZONE转换(比如created_at AT TIME ZONE 'UTC' >= CURRENT_TIMESTAMP AT TIME ZONE 'UTC' - INTERVAL '1 hour')。 - 错误截断了记录时间:比如用
DATE_TRUNC('hour', created_at) >= ...,如果你的记录有非整点的时间,可能会漏掉部分符合条件的记录。
内容的提问来源于stack exchange,提问作者Jeremy
相关产品推荐
相关产品推荐

