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')