База данных «Аэрофлот»

Схема БД состоит из четырех таблиц:

Company (ID_comp, name)
Trip(trip_no, ID_comp, plane, town_from, town_to, time_out, time_in)
Passenger(ID_psg, name)
Pass_in_trip(trip_no, date, ID_psg, place)

Таблица Company содержит идентификатор и название компании, осуществляющей перевозку пассажиров. Таблица Trip содержит информацию о рейсах: номер рейса, идентификатор компании, тип самолета, город отправления, город прибытия, время отправления и время прибытия. Таблица Passenger содержит идентификатор и имя пассажира. Таблица Pass_in_trip содержит информацию о полетах: номер рейса, дата вылета (день), идентификатор пассажира и место, на котором он сидел во время полета. При этом следует иметь в виду, что

  • рейсы выполняются ежедневно, а длительность полета любого рейса менее суток;

  • время и дата учитывается относительно одного часового пояса;

  • время отправления и прибытия указывается с точностью до минуты;

  • среди пассажиров могут быть однофамильцы (одинаковые значения поля name, например, Bruce Willis);

  • номер места в салоне – это число с буквой; число определяет номер ряда, буква (a – d) – место в ряду слева направо в алфавитном порядке;

  • связи и ограничения показаны на схеме данных.

Database Scheme
Рис. Схема базы данных «Аэропорт»

Нередко задают такой вопрос: “Почему в таблице Trip днём отправления/прибытия является 1900-01-01?”

В таблице Trip содержится только время отправления/прибытия, поскольку, согласно описанию предметной области, рейсы выполняются ежедневно. Присутствие даты объясняется тем, что в ранних версиях SQL Server не было отдельных типов данных для даты (DATE) и времени (TIME), которые появились только в версии 2008 года. Поэтому использовался тип DATETIME, соответствующий стандартному TIMESTAMP, включающему все составляющие штампа времени.

Что же касается конкретно даты 1900-01-01, то эта дата соответствует началу отсчета времени, т.е. нулю. Выполните запрос:

SELECT CAST(0 AS DATETIME);
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
и вы получите

1900-01-01 00:00:00.000

Т.е. если ввести в столбец типа DATETIME только время, то датой этого значения станет 1900-01-01. В этом можно убедиться, явно приведя значение времени к типу DATETIME, например:

SELECT CAST('13:44:00' AS DATETIME);
mssql
🚫
[[ error ]]
[[ column ]]
[[ value ]]
1900-01-01 13:44:00.000