为什么我的时间戳查询不是 return 值正好在整点?

Why does my timestamp query not return values exactly on the hour?

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

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

第二个只查询日期,然后查询所有具有 DATE_PART('HOUR', published) = 10 的元素,这应该(理论上)return 完全相同。

不过,正如下面的查询所示,有两个元素在整点正好 偶然发布。尽管它们仍然具有相同的 DATE_PART 签名,但它们似乎在第二个查询中被忽略了。

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

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

问题原来是第一个查询周围缺少一组括号,其中两个日期范围应该在一组单独的括号内使用 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'