我在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
!
答案 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
这确实很奇怪......