В прошлой статье мы разобрали решение 6 задачи. Сейчас же перепрыгнем сразу на десятую, т.к. в 7, 8, и 9 нет ничего принципиально интересного или нового (разве что, в восьмой используется оператор для расчета разницы между двумя datetime-переменными TIMEDIFF(t.time_in, t.time_out) AS flight_time).
Задача - Вывести вылеты, совершенные с 10 ч. по 14 ч. 1 января 1900 г.
Задачка, казалось бы, пустяковая. Но хочу остановиться на одном моменте. По опыту проведения тестовых заданий, 7 из 10 человек в подобной задаче напишут запрос подобного вида:
SELECT *
FROM Trip AS t
WHERE
t.time_out BETWEEN '1900-01-01 10:00' AND '1900-01-01 14:00'
(Спойлер - это в том числе является правильным ответом). И у меня всегда возникает вопрос, зачем использовать BETWEEN? В задаче, где речь пойдет не о датах, а о числовых значениях (вывести, например, всех людей с кол-вом заказов от 5 до 10), те же самые люди и не вспомнят о BETWEEN, а обойдутся больше/меньше/больше или равно/меньше или равно.
Чем неудобен BETWEEN? Собственно, только тем, что границы интервала по умолчанию включены в результат. И это дает куда меньшую вариативность либо необходимость дополнительных условий. Куда проще использовать знакомые со школы "> < >= <=".
Хочешь, чтобы границы дат попадали? t.time_out >='1900-01-01 10:00' AND t.time_out <= '1900-01-01 14:00' (эквивалентно BETWEEN)
Наоборот, не попадали? t.time_out >'1900-01-01 10:00' AND t.time_out < '1900-01-01 14:00'
Вот пример реального запроса с BETWEEN. Обратите внимание, что '2021-07-22 00:00:00' попадает в условие BETWEEN '2021-07-21' AND '2021-07-22'. Если это не учитывать, то можно с легкостью посчитать лишнюю транзакцию или еще что-то, что не подразумевалось автором запроса.
Поэтому я бы запрос к задаче №10 сформировал такой:
SELECT *
FROM Trip AS t
WHERE t.time_out >='1900-01-01 10:00'
AND t.time_out <='1900-01-01 14:00'
Спасибо за прочтение ) подписывайтесь на телеграм