SQL Server DATETIME
имеет точность 3,33 мс - вы всегда получите .997
в качестве значения, близкого к полному часу. Это так, как есть, и вы не можете изменить его в SQL Server 2005. Прочтите все об этом на Демистификация типа данных SQL Server DATETIME .
В SQL Server 2008 вы можете использовать тип данных DATETIME2
, который имеет точность 100 нс, поэтому у вас есть до 7 точных цифр после десятичной точки «секунд».
Обновление: Если вы хотите получить 0,999 с DATETIME2
, вам необходимо использовать:
DECLARE @dt2 DATETIME2
-- you need to cast GETDATE() to DATETIME2 - otherwise it's a DATETIME !
SET @dt2 = CAST(GETDATE() AS DATETIME2)
DECLARE @dt2_Added DATETIME2
SET @dt2_Added = DATEADD(d, DATEDIFF(d, 0, @dt2) + 1, 0)
SELECT DATEADD(ms, -1, @dt2_added)
Результат:
2012-02-26 23:59:59.9990000
Обновление № 2: все становится страннее ...
Если я использую SYSDATETIME()
вместо GETDATE()
, это дает мне DATETIME2
с самого начала - но если я делаю вычисления за один шаг:
DECLARE @dt2 DATETIME2
SET @dt2 = SYSDATETIME()
SELECT DATEADD(ms, -1, DATEADD(d, DATEDIFF(d, 0, @dt2) + 1, 0) )
Я получаю результат:
2012-02-27 00:00:00.000
но если я сделаю один и тот же расчет в два этапа:
DECLARE @dt2 DATETIME2
SET @dt2 = SYSDATETIME()
DECLARE @dt2_Added DATETIME2
SET @dt2_Added = DATEADD(d, DATEDIFF(d, 0, @dt2) + 1, 0)
SELECT DATEADD(ms, -1, @dt2_added)
Я получаю ожидаемый результат:
2012-02-26 23:59:59.9990000
Это действительно довольно странно ......