Время прочтения: 2 мин.
Написание данной статьи меня подтолкнуло все еще повсеместное использование устаревшего типа данных DateTime во многих проектах в нашей службе. Я и сам лично часто использую это тип данных по привычке. Исследовав представленный несколько лет назад новый тип DateTime2 я был приятно удивлен, что MS SQL предлагает ряд приятных преимуществ. Но обо всем по порядку.
DateTime2 – новый тип данных, представленный в СУБД Sql Server 2008 для хранения даты и времени. Microsoft рекомендует использовать в новых проектах этот тип данных вместо DateTime.
В следующей таблице собраны основные отличия между DateTime2 и DateTime.
DateTime | DateTime2[(n)] | |
Минимальное значение | 1753-01-01 00:00:00 | 0001-01-01 00:00:00 |
Максимальное значение | 9999-12-31 23:59:59.997 | 9999-12-31 23:59:59.9999999 |
Размер | 8 байт | От 6 до 8 байт Примечание: Параметр n принимает значений от 0 до 7 и если не указан, то доли секунды занимают 7 цифр. При значении n <3 объём занимаемых данных составляет 6 байт, от 3 до 4 — 7 байт, а при значении от 4 — 8 байт |
Использование | declare @date datetime | Declare @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). В этом можно легко убедиться на следующем примере:
