Найти в Дзене
Налейте аналитику

Разбор задачи SQL №10

В прошлой статье мы разобрали решение 6 задачи. Сейчас же перепрыгнем сразу на десятую, т.к. в 7, 8, и 9 нет ничего принципиально интересного или нового (разве что, в восьмой используется оператор для расчета разницы между двумя datetime-переменными TIMEDIFF(t.time_in, t.time_out) AS flight_time).

Задача - Вывести вылеты, совершенные с 10 ч. по 14 ч. 1 января 1900 г.

-2

Задачка, казалось бы, пустяковая. Но хочу остановиться на одном моменте. По опыту проведения тестовых заданий, 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'

-3

Вот пример реального запроса с 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'

-4

Спасибо за прочтение ) подписывайтесь на телеграм