Типы дата-время и интервальные типы
Начнем с того, по какой причине в языке SQL появились эти типы данных (все вместе их можно было бы назвать темпоральными типами, т.е. типами, связанными со временем). В принципе, таблицы реляционных баз данных являются плоскими; каждая строка таблицы соответствует текущему состоянию моделируемого объекта предметной области. Однако на практике часто возникает потребность хранить в одной таблице информацию о состоянии объектов в разные моменты времени. До появления в языке темпоральных типов это можно было реализовать только одним способом: ввести в таблицу дополнительный столбец, в котором хранились бы временные метки создания соответствующих строк. Но если нет унифицированного представления таких временных меток, то вся логика их обработки уходит в прикладную программу, и другая прикладная программа не сможет работать с той же базой данных, если эта логика не будет в нее перенесена. Так что идея очень проста: унифицировать и сделать понятным системе смысл временных меток и временных интервалов.
Однако механизм, предлагаемый в стандарте SQL/92, очень громоздок по причине большого количества несущественных по смыслу деталей: с какой точностью сохранять временные метки и интервалы, как задать временную зону, в которой они возникают и т.д. Поэтому мы рассмотрим особенности этих типов очень коротко (соответствующие спецификации составляют значительную часть громадного документа).
Элемент типа дата-время составляется из смежного поднабора полей:
YEAR | Год от Рождества Христова |
MONTH | Месяц в пределах года |
DAY | День в пределах месяца |
HOUR | Час в пределах дня |
MINUTE | Минута в пределах часа |
SECOND | Секунда и, возможно, доли секунды в пределах минуты |
Реальный смежный поднабор полей, составляющих элемент типа дата-время определяется квалификатором дата-времени, называемым точностью элемента. Имеется подразумеваемая упорядоченность полей YEAR, MONTH, DAY, HOUR, MINUTE, SECOND. Значения каждого поля ограничиваются естественными правилами, регулирующими законные даты и время.
Элемент типа INTERVAL составляется из смежного поднабора полей:
YEAR | Года |
MONTH | Месяца |
или
DAY | Дни |
HOUR | Часы |
MINUTE | Минуты |
SECOND | Секунды и, возможно, доли секунд |
Внутри элемента типа интервал первое поле не ограничивается. Последующие поля ограничиваются следующим образом:
MONTH | Месяцы в пределах года (0-11) |
DAY | Не ограничивается |
HOUR | Часы в пределах дня (0-23) |
MINUTE | Минуты в пределах часа (0-59) |
SECOND | Секунды в пределах минуты (0-59.999...) |
Тип первого операнда | Оператор | Тип второго операнда | Тип результата |
Datetime | - | Datetime | Interval |
Datetime | + или - | Interval | Datetime |
Interval | + | Datetime | Datetime |
Interval | + или - | Interval | Interval |
Interval | * или / | Numeric | Interval |
Numeric | * | Interval | Interval |