SQL Server DATETIME 的准确度为 3.33 毫秒 - 您将始终将 .997 作为最接近一小时的值。就是这样,您无法在 SQL Server 2005 中更改它。在Demystifying the SQL Server DATETIME datatype 阅读有关它的所有信息。
在 SQL Server 2008 中,您可以使用精度为 100ns 的 DATETIME2 数据类型 - 因此“秒”小数点后最多有 7 个精确数字。
更新:如果你想用 DATETIME2 获得 .999,你需要使用:
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
这确实很奇怪……