DateTime против DateTime2 Несоответствие временного диапазона - PullRequest
0 голосов
/ 20 сентября 2018

Рассматривая различия между DateTime и DateTime2, я заметил, что устаревший тип данных DateTime имеет нечетный диапазон времени от 00:00:00.000 до 23:59:59.997, тогда как тип данных DateTime2 имеет ограничение 00:00:00.0000000 - 23:59:59.9999999.

Я предположил, что это ограничение, скорее всего, связано с более ранними ограничениями. Может кто-нибудь объяснить, почему это ограничение действует?

Ответы [ 3 ]

0 голосов
/ 20 сентября 2018

Первым делом первым ... DATETIME не считается устаревшим.

Причина расхождения заключается в том, что исходное время даты имеет разрешение 3 миллисекунды.Более новый DATETIME2 имеет разрешение 100 наносекунд.

Разрешение DATETIME «3 миллисекунды» - это то, почему вы видите 23: 59: 59.997, а не 23: 59: 59.999, а затем переходите к 00: 00: 00.000

0 голосов
/ 20 сентября 2018

Странный предел и поведение (например, последняя цифра, всегда равная 0, 3 или 7) связано с тем, как часть времени внутренне хранится в DATETIME:

Часть времени сохраняется какколичество тиков с 00:00:00 ( 1 и 2 ).Каждый тик составляет ровно 1/300 th секунды.Имея это в виду, тип DATETIME может хранить только такие значения, как:

00:00:00.000 -- 0 ticks
00:00:00.003 -- 1 tick,      1/300 = 0.003333 sec
00:00:00.007 -- 2 ticks,     2/300 = 0.006666 sec
00:00:00.010 -- 3 ticks,     3/300 = 0.01 sec
00:00:00.997 -- 299 ticks, 299/300 = 0.996666 sec
00:00:01.000 -- 300 ticks, 300/300 = 1 second

Поскольку невозможно сохранить половину или четверть тиков, DATETIME не может хранить или представлять значения вмежду.Например, если вы попытаетесь сохранить значение, например CAST('2000-01-01 00:00:00.999' AS DATETIME), оно будет округлено до 2000-01-01 00:00:01.000.

0 голосов
/ 20 сентября 2018

Это связано с точностью.Вы можете сделать ваше определение DateTime2 с точностью, аналогичной DateTime, если вы определите его как DateTime2(3).Точность 7 оказывается значением по умолчанию для DateTime2, что вы и видите в своем вопросе.


См. Также datetime2 (Transact-SQL) документация *Точность 1011 *

- от 0 до 7 цифр с точностью до 100 нс.Точность по умолчанию составляет 7 цифр.


См. Также datetime (Transact-SQL)

Используйте время, дату, datetime2 итипы данных datetimeoffset для новой работы.Эти типы соответствуют стандарту SQL.Они более портативны.time, datetime2 и datetimeoffset обеспечивают большую точность секунд.datetimeoffset обеспечивает поддержку часовых поясов для глобально развернутых приложений

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...