Как написать SQL-запрос для выборки заказов по user_id и дате с использованием BETWEEN?
Что проверяют
Базовый SQL и то, видите ли вы подвох в границах диапазона. Для тестировщика это рабочий навык: проверить, что заказ записался, подготовить данные, сверить отчёт. Следом почти всегда спрашивают, включает ли BETWEEN границы и попадёт ли в выборку заказ, сделанный 31 января в 15:00.
Как отвечать
Сам запрос простой:
SELECT id, user_id, order_date, status
FROM orders
WHERE user_id = 123
AND order_date BETWEEN '2026-01-01' AND '2026-01-31'
ORDER BY order_date;Дальше покажите, что понимаете детали:
- границы включительные:
BETWEEN a AND bозначает>= a AND <= b; - тип колонки решает всё: если
order_dateимеет типtimestamp, строка'2026-01-31'превращается в2026-01-31 00:00:00, и заказы за 31 января после полуночи не попадут. Надёжнее полуоткрытый интервал:order_date >= '2026-01-01' AND order_date < '2026-02-01'; - порядок границ: если большее значение стоит первым, результат будет пустым. В PostgreSQL для этого есть
BETWEEN SYMMETRIC; - часовые пояса: если колонка хранит время в UTC, а тест проверяет «заказы за сегодня по Москве», границы надо пересчитать;
- *явные столбцы вместо `SELECT `**: проверка не сломается, когда в таблицу добавят колонку.
Упомяните, что такому запросу нужен составной индекс по (user_id, order_date). А как тестировщик предложите граничные проверки: заказ ровно в начале диапазона, в последнюю секунду последнего дня, за день до и через день после.
Где спотыкаются
Используют BETWEEN с датами по колонке timestamp и теряют последний день. Это самая частая ошибка, и её обычно и ждут.
Сравнивают дату со строкой вида '31.01.2026'. Разбор такой строки зависит от настроек СУБД и сессии, надёжен только ISO-формат YYYY-MM-DD.
Собирают запрос в автотесте склейкой строк, подставляя userId и даты прямо в текст. Это и SQL-инъекция, и сломанные форматы дат. Используйте PreparedStatement или параметры своей библиотеки.