Нужно отобрать заказы за текущий календарный месяц по created_at (тип timestamp). Какое условие в WHERE корректно и обычно лучше использует индекс по created_at?

AWHERE created_at >= current_date - INTERVAL '30 days': фильтр последних 30 дней, а не календарного месяца
BWHERE created_at >= DATE_TRUNC('month', current_date) AND created_at < DATE_TRUNC('month', current_date) + INTERVAL '1 month'
CWHERE DATE_TRUNC('month', created_at) = DATE_TRUNC('month', current_date): функция на колонке мешает использовать индекс
DWHERE created_at >= DATE_TRUNC('month', current_date) + INTERVAL '1 month': фильтр будущего месяца без подходящих заказов
Правильный ответ. Для текущего календарного месяца используйте полуинтервал [начало месяца, начало следующего месяца) без функции на колонке.

Разбор

Выражение DATE_TRUNC('month', created_at) = ... часто заставляет СУБД применять функцию к каждой строке и может мешать использовать индекс. Диапазон created_at >= start AND created_at < start + INTERVAL '1 month' обычно быстрее и однозначно задаёт границы месяца.

Проверь себя · 1/3разбор после ответа
В таблице events(user_id, created_at) поле created_at имеет тип отметки времени с долями секунд. Как корректно посчитать количество событий по дням?
Тренировать SQL в Telegram

Ещё вопросы по теме «Даты и время»