SQL Server 2008 и миллисекунды - PullRequest
13 голосов
/ 16 ноября 2011

Почему в SQL Server 2008 следующие запросы возвращают одно и то же значение?

-- These all return 2011-01-01 23:59:59.997
SELECT CAST('2011-01-01 23:59:59.997' as datetime)
SELECT CAST('2011-01-01 23:59:59.998' as datetime)

А почему следующий запрос округляется до следующего дня?

-- Returns 2011-01-02 00:00:00.000
SELECT CAST('2011-01-01 23:59:59.999' as datetime)

Ответы [ 2 ]

27 голосов
/ 16 ноября 2011

Точность DateTime в SQL Server всегда составляла 1/300 с секунды (3,33 мс), поэтому любое значение, которое не делится, точно округляется.

  • 997 остается неизменным
  • 998 округляется до 997
  • 999 округляется до 000

Чтобы получить дополнительную точность, существует тип данных DateTime2, доступный в SQL Server 2008 и далее., это может быть с точностью до 7 знаков после запятой.

3 голосов
/ 16 ноября 2011

Документы MSDN для даты и времени на http://msdn.microsoft.com/en-us/library/ms187819.aspx скажем

Диапазон времени == 00:00:00 - 23: 59: 59.997 Точность == Округлено с шагом .000, .003 или .007 секунд

В связанном документе также есть раздел «Округление даты и времени Дробной второй точности».

datetime2 дает вам больше точности.

...