SQL Server 2008 и миллисекунды

В 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)

Ответ 1

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

  • 997 остается, как есть
  • 998 будет округлять до 997
  • 999 округляется до 000

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

Ответ 2

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

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

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

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