为什么我的时间戳查询不是 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'
我有一个包含相关发布日期的文档数据集(常规 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'