Короткий ответ
Безопаснее использовать полуоткрытый интервал order_date >= '2024-03-01' AND order_date < '2024-04-01', чем BETWEEN '2024-03-01' AND '2024-03-31', особенно если order_date хранится как timestamp, а не как чистая дата.
Как это работает подробнее
BETWEEN a AND b эквивалентно >= a AND <= b. Если поле — date, BETWEEN '2024-03-01' AND '2024-03-31' действительно включает весь март. Но если поле — timestamp, то '2024-03-31' интерпретируется как полночь 2024-03-31 00:00:00, и заказы, сделанные позже полуночи 31 марта (например, в 15:00), в диапазон не попадут.
Пример кода
Запрос SQL
SELECT *
FROM orders
WHERE order_date >= '2024-03-01' AND order_date < '2024-04-01';Что использовать на практике
- На практике: полуоткрытый интервал
[начало месяца, начало следующего месяца)работает одинаково надёжно независимо от того,dateэто илиtimestamp, и его проще обобщить на произвольный период, вычисляя границы динамически. - Результат: Результат — все заказы марта 2024, включая сделанные в последнюю секунду 31 марта.
- Проверка: сравнить максимум
order_dateв результате с максимумомorder_dateпо всей таблице за март, отфильтрованной вручную черезEXTRACT.
Подводные камни
- Частая ошибка: используют
BETWEENс текстовой датой конца периода без времени дляtimestamp-столбца и теряют часть дня; либо жёстко прописывают'2024-03-31 23:59:59', что технически работает, но ломается при наличии долей секунды или при смене типа столбца.