获取SQL Server之前的最后一个ms?

时间:2012-02-26 15:19:42

标签: sql-server sql-server-2005 datetime

我在SQL Server中使用Between命令。

我需要找到:

 select * from MyTable where myDate
 between getdate() and [1ms before tomorrow  = 2012-02-26 :23:59:59:999]

我不想[2012-02-27:00:00:00:000]因为未来的查询应该使用该值。

所以我明天需要1毫秒。

然而 - 这是我尝试过的但是由于某种原因它拒绝给我欲望的价值! 并且给我:2012-02-26 23:59:59.997 +不可预知的结果!

为什么?我错过了什么?

我想获得2012-02-26 :23:59:59:999

enter image description here

2 个答案:

答案 0 :(得分:3)

为什么不指定专属范围呢?

SELECT * FROM `MyTable`
 WHERE `myDate` >= GETDATE() AND `myDate` < (tomorrow)

(我不知道如何得到明天的DATETIME,因为我通常是一个MySQL人,但我相信你已经知道该怎么做了。)

否则你就会陷入可疑准确度的浮点值。

答案 1 :(得分:2)

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

这确实很奇怪......