为什么我的时间戳查询不完全按小时返回值?

时间:2018-12-05 12:32:45

标签: postgresql timestamp sql-timestamp

我有一个具有相关发布日期的文档数据集(常规Postgres TIMESTAMP。 在注意到其中一些数据点由于某种原因而无效之后,我想从特定地点删除在两个特定日期上午10点至11点发布的所有文档。

到目前为止,我想出了两个不同的查询来执行此操作,但是它们奇怪地返回了不同的结果。第一个查询基于简单的DATETIME范围查询返回所有文档,并具有1603个结果。

第二个查询仅查询日期,然后查询所有具有DATE_PART('HOUR', published) = 10的元素,这些元素在理论上应返回完全相同的值。

但是,如下面的查询所示,有两个元素是在一个小时内准确地偶然发布的。尽管它们仍然具有相同的DATE_PART签名,但在第二个查询中似乎被忽略了。

谁能告诉我这是否是默认行为,或者为什么这会返回不同的答案?

postgres=# SELECT document_id, published, DATE_PART('HOUR', published) AS hour 
FROM documents 
WHERE (published >= '2016-08-18 10:00:00.000' AND published <= '2016-08-18 10:59:59.999')                                                         
OR (published >= '2016-08-28 10:00:00.000' AND published <= '2016-08-28 10:59:59.999') 
AND feedName = 'WP'
EXCEPT
SELECT document_id, published, DATE_PART('HOUR', published) AS hour 
FROM documents WHERE (to_char(published, 'YYYY-MM-DD') = '2016-08-18' 
OR to_char(published, 'YYYY-MM-DD') = '2016-08-28') 
AND feedName = 'WP' AND DATE_PART('HOUR', published) = 10;

 document_id |      published      | hour 
-------------+---------------------+------
       75676 | 2016-08-18 10:00:00 |   10
       76424 | 2016-08-18 10:00:00 |   10

1 个答案:

答案 0 :(得分:0)

问题原来是第一个查询周围缺少括号,其中两个日期范围应该已经与OR运算符连接在单独的括号内,例如:

SELECT document_id, published, DATE_PART('HOUR', published) AS hour 
FROM documents 
WHERE ((published >= '2016-08-18 10:00:00.000' AND published <= '2016-08-18 10:59:59.999')                                                         
OR (published >= '2016-08-28 10:00:00.000' AND published <= '2016-08-28 10:59:59.999')) 
AND feedName = 'WP'