Почему мой запрос метки времени не возвращает значения точно в час? - PullRequest
0 голосов
/ 05 декабря 2018

У меня есть набор данных документов с соответствующими датами публикации (обычные 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 голосов
/ 17 декабря 2018

Проблема оказалась в отсутствии набора скобок вокруг первого запроса, где два диапазона дат должны были быть связаны с оператором 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'
...