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 дает вам больше точности.