Найти в Дзене

Задача # 10. Разбор задачи по SQL: Выбор рейсов в определённый временной интервал

Оглавление

SQL — это универсальный язык для взаимодействия с базами данных, который должен знать каждый аналитик, разработчик и дата-инженер. На собеседованиях кандидатам часто предлагают решить практические задачи: написать эффективные запросы, оптимизировать их и предложить решение для конкретных бизнес-кейсов. Давай разберём распространённые типы SQL-задач и эффективные подходы к их решению.

Предыдущее задание:

Постановка задачи

Требуется вывести все рейсы, которые были совершены в период с 10:00 до 14:00 1 января 1900 года. Результирующая таблица должна содержать все поля таблицы рейсов (используется *).

Анализ структуры базы данных

Для решения задачи нам понадобится таблица:

  • Trip — содержит информацию о рейсах, включая:
    time_out — время вылета (ключевое поле для фильтрации)
    Другие поля рейса (номер, модель самолёта, города вылета/прилёта и т.д.)

Детальный разбор решения

SQL-запрос

SELECT *
FROM Trip AS t
WHERE t.time_out >= '1900-01-01 10:00'
AND t.time_out <= '1900-01-01 14:00';

Альтернативный вариант с BETWEEN

SELECT *
FROM Trip
WHERE time_out BETWEEN '1900-01-01 10:00:00' AND '1900-01-01 14:00:00';

Пошаговое объяснение:

  1. SELECT * — выбираем все поля таблицы Trip
  2. FROM Trip AS t — указываем таблицу с алиасом 't' (необязательно в данном случае)
  3. WHERE — условия фильтрации:
    time_out >= '1900-01-01 10:00' — вылет не раньше 10:00
    time_out <= '1900-01-01 14:00' — вылет не позже 14:00

Ключевые аспекты решения

1. Работа с датой и временем

Особенности временного интервала:

  • Формат даты-времени должен соответствовать стандарту SQL: 'YYYY-MM-DD HH:MM'
  • Временные границы включаются в результат (>= и <=)
  • Можно использовать более точный формат с секундами

2. Использование BETWEEN

Альтернативный вариант с BETWEEN:

  • Более читаемый синтаксис
  • Включает граничные значения
  • Эквивалентен комбинации >= и <=

3. Выбор всех полей таблицы

Использование SELECT * оправдано, когда:

  • Нужны все поля таблицы
  • Структура таблицы неизвестна или часто меняется
  • В условии задачи явно требуется вывод всех полей

Возможные модификации запроса

1. Сортировка по времени вылета

SELECT *
FROM Trip
WHERE time_out BETWEEN '1900-01-01 10:00' AND '1900-01-01 14:00'
ORDER BY time_out;

2. Выбор конкретных полей

Если нужны не все поля:

SELECT trip_no, plane, town_from, town_to, time_out
FROM Trip
WHERE time_out BETWEEN '1900-01-01 10:00' AND '1900-01-01 14:00';

3. Учёт временных зон

Если нужно учитывать часовой пояс:

Оптимизация запроса

Для улучшения производительности:

  1. Создать индекс на поле time_out
  2. Для больших таблиц ограничить выборку дополнительными условиями
  3. Рассмотреть возможность использования секционирования таблицы по датам

Частые ошибки

  1. Неправильный формат даты-времени
  2. Использование только > или < вместо >= и <= (потеря граничных значений)
  3. Путаница между time_out и time_in
  4. Неучёт временных зон при работе с распределёнными системами

Дополнительные соображения

  1. В реальных системах дата 1900 года может быть тестовой или означать "дата не указана"
  2. Для исторических данных могут быть особенности хранения дат
  3. Временной интервал можно задавать разными способами:
    Через BETWEEN
    Через >= и <=
    Через диапазон в WHERE с AND

Заключение

Данная задача демонстрирует:

  1. Основы фильтрации по временным интервалам
  2. Работу с условиями диапазона
  3. Особенности сравнения дат и времени в SQL

🔑 Итоговое решение:

SELECT *
FROM Trip
WHERE time_out BETWEEN '1900-01-01 10:00:00' AND '1900-01-01 14:00:00';

Альтернативное решение:

SELECT *
FROM Trip
WHERE time_out >= '1900-01-01 10:00:00'
AND time_out <= '1900-01-01 14:00:00';