我有一个相当奇怪的“错误”,只有一个简单的查询,我依旧记得很久以前在某个地方读过它的原因,但是会喜欢有人来刷新我的记忆。
该表是基本ID,日期时间表。
查询是:
select ID, Datetime from Table where Datetime <= '2010-03-31 23:59:59'
问题是查询结果包括Datetime为'2010-04-01 00:00:00'的结果。第二天。不应该这样。
任何?
干杯
武
答案 0 :(得分:7)
查看How Are Dates Stored In SQL Server?和How Does Between Work With Dates In SQL Server?
如果那是一个smalldatetime,它有1分钟的精度,所以如果向上舍入,对于datetime它是300毫秒
例如
DECLARE @d DATETIME
SELECT @d = '2001-12-31 23:59:59.999'
SELECT @d
2002-01-01 00:00:00.000
DECLARE @d DATETIME
SELECT @d = '2001-12-31 23:59:59.998'
SELECT @d
2001-12-31 23:59:59.997
在你的情况下,总是在午夜使用不到第二天
< '20100401'
答案 1 :(得分:3)
你看到的很奇怪;我不知道为什么。但我建议您以这种方式编写查询:
select ID, Datetime from Table where Datetime < '2010-04-01'
答案 2 :(得分:3)
尝试这样做:
select ID, Datetime from Table where Datetime < '2010-04-01'
我总是将日期时间置于日期并增加日期并使用“&lt;”不到。
将日期时间设置为仅使用日期:
SELECT DATEADD(day,DATEDIFF(day,0, GETDATE() ),0)
您可以使用添加:
轻松增加日期时间SELECT GETDATE()+1
使用'23:59:59'你可以错过行,试试看:
DECLARE @YourTable table (RowID int, DateOf datetime)
INSERT INTO @YourTable VALUES (1,'2010-03-31 10:00')
INSERT INTO @YourTable VALUES (2,'2010-03-31')
INSERT INTO @YourTable VALUES (3,'2010-03-31 23:59:59')
INSERT INTO @YourTable VALUES (4,'2010-03-31 23:59:59.887')
INSERT INTO @YourTable VALUES (5,'2010-04-01')
INSERT INTO @YourTable VALUES (6,'2010-04-01 10:00')
select * from @YourTable where DateOf <= '2010-03-31 23:59:59'
输出
RowID DateOf
----------- -----------------------
1 2010-03-31 10:00:00.000
2 2010-03-31 00:00:00.000
3 2010-03-31 23:59:59.000
(3 row(s) affected
此查询错误,因为它找不到错过的rowID = 4记录。
如果您尝试使用以下方法解决此问题:
select * from @YourTable where DateOf <= '2010-03-31 23:59:59.999'
然后也会包含RowID = 5,这是错误的。