PostgreSQL-фильтр диапазона дат
Я разработчик SQL и провожу большую часть своего времени в MSSQL. Я ищу лучший способ фильтровать поле "отметка времени без часового пояса" в PostgreSQL DB
Я:
Where
DateField >= '2010-01-01' and
DateField < '2012-01-01'
но учитывая, что я не эксперт в синтаксисе, я должен думать, что есть лучший способ.
предложения? Спасибо.
2 ответов
ваше решение в порядке. Если даты являются литералами, я бы предпочел, хотя:
WHERE datefield >= '2010-01-01 00:00:00'
AND datefield < '2012-01-01 00:00:00'
это выполняет точно то же самое, но более ремонтируемо, потому что это делает ясным, что каждая буквальная "дата" является меткой времени, а не датой. Например, предположим, что когда-нибудь кто-то изменит ваш запрос на следующий
AND datefield <= '2012-01-01'
... ожидается (и не удается) включить полный день "2012-01-01" в запрос. С более поздним синтаксисом намерение более ясно, и это путаница предотвращена.
чтобы сделать его еще более ясным (возможно, слишком многословным), вы можете сделать явный бросок:
WHERE datefield >= '2010-01-01 00:00:00'::timestamp
AND datefield < '2012-01-01 00:00:00'::timestamp
Я бы не стал использовать to_date()
здесь по аналогичным причинам (потенциальная путаница типов данных), ни to_timestamp()
(она возвращает timestamptz
).
кстати, я изменил случай, чтобы соответствовать рекомендуемой практике (ключевые слова в верхнем регистре, идентификаторы в нижнем регистре)
для интервалов дат вы можете использовать что-то вроде:
WHERE DateField BETWEEN to_date('2010-01-01','YYYY-MM-DD')
AND to_date('2010-01-02','YYYY-MM-DD')
Это короче (вам не нужно повторять DateField
), и имеет явный формат даты.
в течение 1 часа / дня / месяца / года вы можете использовать:
WHERE date_trunc('day',DateField) = to_date('2010-01-01','YYYY-MM-DD')