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

AWHERE created_at >= current_date - INTERVAL '30 days'
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'
Правильный ответ. Для календарного месяца используйте диапазон [start_of_month, start_of_next_month) без функции на колонке.

Разбор

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

Проверь себя · 1/3разбор после ответа
Какое описание лучше всего соответствует типу timestamptz в PostgreSQL?
Тренировать SQL в Telegram

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