Datetime BETWEEN语句在SQL Server中不起作用

时间:2013-10-18 14:09:17

标签: sql-server sql-server-2008 between

我有以下查询,

SELECT * FROM LOGS 
WHERE CHECK_IN BETWEEN CONVERT(datetime,'2013-10-17') AND CONVERT(datetime,'2013-10-18')

此查询不返回任何结果,但以下查询返回结果

SELECT * FROM LOGS WHERE CHECK_IN >= CONVERT(datetime,'2013-10-17')

为什么第一个查询没有返回任何结果?如果我有任何错误请纠正我。

5 个答案:

答案 0 :(得分:35)

您的日期与时间有关吗? BETWEEN是包容性的,但当您将2013-10-18转换为日期时,它将变为2013-10-18 00:00:000.00。除非您包含时间值,否则在18日的第一秒之后记录的任何内容都不会使用BETWEEN显示。

尝试:

SELECT * FROM LOGS WHERE CHECK_IN BETWEEN CONVERT(datetime,'2013-10-17') AND CONVERT(datetime,'2013-10-18 23:59:59:999')

如果你想搜索18日的整个一天。

SQL DATETIME字段有毫秒。所以我在场上加了999。

答案 1 :(得分:5)

第二个查询是从第17个返回结果还是从第18个结果返回?

第一个查询只会返回17日或18日午夜的结果。

试试这个

select * 
from LOGS 
where check_in >= CONVERT(datetime,'2013-10-17') 
and check_in< CONVERT(datetime,'2013-10-19')

答案 2 :(得分:2)

您的任何一个查询都没有任何错误。 我的猜测如下:

  • 2013-10-17'和'2013-10-18'之间没有记录
  • 第二个查询返回的记录在'2013-10-18'
  • 之后存在

答案 3 :(得分:0)

您需要将日期字段转换为varchar以消除时间,然后将其转换回日期时间,这会将时间重置为00:00:00.000&#39;。

SELECT *
FROM [TableName]
WHERE
    (
        convert(datetime,convert(varchar,GETDATE(),1)) 

        between 

        convert(datetime,convert(varchar,[StartDate],1)) 

        and  

        convert(datetime,convert(varchar,[EndDate],1))
    )

答案 4 :(得分:0)

从Sql Server 2008开始,您有“日期”格式。

所以你可以使用

SELECT * FROM LOGS WHERE CONVERT(date,[CHECK_IN]) BETWEEN '2013-10-18' AND '2013-10-18'

https://docs.microsoft.com/en-us/sql/t-sql/data-types/date-transact-sql