SQL: выбрать записи за день без ошибки времени

Категория: Postgresql · Язык: SQL · Обновлено:

Для выборки всех записей за день по столбцу timestamp используйте полуоткрытый интервал: created_at >= начало_дня AND created_at < начало_следующего_дня. Так запрос включает любое время внутри дня и не зависит от точности дробных секунд.

Записи за конкретный день

SQL
CREATE TEMP TABLE events (id int, created_at timestamp);
INSERT INTO events VALUES
  (1, TIMESTAMP '2026-10-25 00:00:00'),
  (2, TIMESTAMP '2026-10-25 23:59:59.900'),
  (3, TIMESTAMP '2026-10-26 00:00:00');

SELECT id FROM events
WHERE created_at >= TIMESTAMP '2026-10-25 00:00:00'
  AND created_at <  TIMESTAMP '2026-10-26 00:00:00'
ORDER BY id;

Записи с id 1 и 2 попадут в результат, строка следующего дня — нет.

Почему не BETWEEN?

BETWEEN включает обе границы. Условие BETWEEN '2026-10-25 00:00:00' AND '2026-10-25 23:59:59' пропустит значения с дробными долями секунды после 23:59:59.

Тип столбца

Важный нюанс

date

Сравнивается с календарной датой

timestamp

Время без часового пояса

timestamptz

Момент времени; границы задавайте в нужной зоне

Можно ли обернуть столбец в DATE(created_at)?

Можно, но функция над столбцом может помешать обычному индексу. Диапазонные границы обычно проще оптимизировать; проверьте план запроса.