SQL

Разница между типами данных DateTime и DateTime2

Время прочтения: 2 мин.

Написание данной статьи меня подтолкнуло все еще повсеместное использование устаревшего типа данных DateTime во многих проектах в нашей службе. Я и сам лично часто использую это тип данных по привычке. Исследовав представленный несколько лет назад новый тип DateTime2 я был приятно удивлен, что MS SQL предлагает ряд приятных преимуществ. Но обо всем по порядку.

DateTime2 – новый тип данных, представленный в СУБД Sql Server 2008 для хранения даты и времени. Microsoft рекомендует использовать в новых проектах этот тип данных вместо DateTime.

В следующей таблице собраны основные отличия между DateTime2 и DateTime.

DateTimeDateTime2[(n)]
Минимальное значение1753-01-01 00:00:000001-01-01 00:00:00
Максимальное значение9999-12-31 23:59:59.9979999-12-31 23:59:59.9999999
Размер8 байтОт 6 до 8 байт
Примечание: Параметр n принимает значений от 0 до 7 и если не указан, то доли секунды занимают 7 цифр.
При значении  n <3 объём занимаемых данных составляет 6 байт, от 3 до 4 —
7 байт, а при значении от 4 —  8 байт
Использованиеdeclare @date datetimeDeclare @date datetime2(7)
СовместимостьНе соответствует стандартам ANSI и ISO 8601Соответствие стандартам ANSI и ISO 8601
Получение текущего времениGetDate() – возвращает текущие дату и время типа DateTime.
Пример: SELECT GETDATE()
Результат: 2021-07-14 02:52:29.803
SYSDATETIME()–возвращает текущие дату и время типа DateTime2.
Пример: SELECT SYSDATETIME()
Результат: 2021-07-14 02:52:40.3629039
Использование операторов +/-Применимо. Пример:

DECLARE @date DATETIME = GETDATE()
SELECT @date+ 1

Результат: 2021-07-15 02:52:55.143
НЕ применимо – необходимо использовать функцию DateAdd.
Пример: 
DECLARE @date2 DATETIME2 = SYSDATETIME()
SELECT @date2+1

Результат: Сообщение 206, уровень 16, состояние 2, строка 2
Operand type clash: datetime2 is incompatible with int

Вывод:

DateTime2  не только отвечает требованиям стандартам ANSI и ISO 8601, но и при значении n=3 соотвествует типу данных DateTime, при это занимая 7 байт вместо 8 у DateTime и предлагаю больший диапазон дат (от 0001-01-01 до 9999-12-31). В этом можно легко убедиться на следующем примере:

Советуем почитать