PostgresSQL-日期工作很奇怪

时间:2019-01-17 14:06:41

标签: sql postgresql timestamp

我需要为当前超过15分钟的所有行创建选择。

SELECT last_answer_date FROM messages WHERE last_answer_date > NOW() - INTERVAL '15 minutes';

当我在16:51:00开始选择时,我得到结果:

2019-01-17 16:25:00

换句话说,我的意思是:

给我所有行where last_answer_date > 16:51:00 - 15 minutes(因为现在是16:51:00)

给我所有行`last_answer_date> 16:36:00(因为现在16:51:00-15分钟= 16:36:00)

我得到16:25:0016:25:00 <16:36:00

编辑:当我将>更改为<时,我得到了2019-01-16 17:50:27

EDIT2 :示例:

SELECT insert_date FROM smev_messages WHERE insert_date < NOW() - INTERVAL '15 minutes';  

现在= 17:16

enter image description here

更改为SELECT insert_date FROM smev_messages WHERE insert_date > NOW() - INTERVAL '15 minutes';

17:17

enter image description here

2 个答案:

答案 0 :(得分:2)

我认为您的时区可能有问题。 您可以使用show timezone;进行检查 或者直接使用select now(),看看它是否符合您的期望。

答案 1 :(得分:0)

如果您的大表中包含大量数据,则将出现一些性能问题,因为调用

  

NOW()-间隔'15分钟'在内部延迟后需要将您的间隔转换为日期   Postgress Interval

我认为一种更好的方法是您应该执行类似的操作以提高性能,因为所有日期都是长值,因此您应该像长值一样进行比较。

-- 15 minutes in millis = 900000 
-- 15 minutes in secods = 900
-- Retrive all data inserted at latest 15 minutes
SELECT last_answer_date FROM messages WHERE (NOW() - last_answer_date) < 900;
-- Retrive all data inserted more than 15 minutes
SELECT last_answer_date FROM messages WHERE (NOW() - last_answer_date) > 900;