Выбор ответа 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, приведение к тексту) скрывает от индекса исходное значение.

Варианты ответа

  1. WHERE created_at::text LIKE '2026-10-01%'
  2. WHERE created_at >= '2026-10-01' AND created_at < '2026-10-02'правильный ответ
  3. WHERE date_trunc('day', created_at) = '2026-10-01'::date
  4. WHERE created_at BETWEEN '2026-10-01' AND '2026-10-01'

Разбор

Функция над колонкой (date(...), date_trunc, приведение к тексту) скрывает от индекса исходное значение. Полуоткрытый диапазон >= начала дня AND < следующего дня работает прямо по индексу и не теряет события в последнюю секунду дня. BETWEEN с одинаковыми границами найдёт только события ровно в полночь. Учтите, что граница дня для timestamptz зависит от часового пояса сессии.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.

Термины по теме