Выбор ответа Middle EXPLAIN и оптимизация спрашивают часто обновлено
Фильтр по дню и индекс
Вопрос
По orders(created_at) (тип timestamptz) есть индекс, но запрос за один день читает всю таблицу. Как переписать условие?
SELECT * FROM orders WHERE date(created_at) = '2026-10-01';
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: WHERE createdat = '2026-10-01' AND createdat < '2026-10-02'. Функция над колонкой (date(...), datetrunc, приведение к тексту) скрывает от индекса исходное значение.
Варианты ответа
WHERE created_at::text LIKE '2026-10-01%'WHERE created_at >= '2026-10-01' AND created_at < '2026-10-02'правильный ответWHERE date_trunc('day', created_at) = '2026-10-01'::dateWHERE created_at BETWEEN '2026-10-01' AND '2026-10-01'
Разбор
Функция над колонкой (date(...), date_trunc, приведение к тексту) скрывает от индекса исходное значение. Полуоткрытый диапазон >= начала дня AND < следующего дня работает прямо по индексу и не теряет события в последнюю секунду дня. BETWEEN с одинаковыми границами найдёт только события ровно в полночь. Учтите, что граница дня для timestamptz зависит от часового пояса сессии.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.