19

我有以下查询,

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')

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

4

5 回答 5

51

您有与您的日期相关的时间吗?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:998')

如果您想搜索 18 日的一整天。我将毫秒设置为 998,因为 SQL Server 在查询中拉入 2013-10-19 00:00:00:0000。

SQL DATETIME 字段有毫秒。所以我在字段中添加了 999。

于 2013-10-18T14:30:55.793 回答
5

第二个查询是从 17 日返回任何结果,还是仅从 18 日返回?

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

试试这个

select * 
from LOGS 
where check_in >= CONVERT(datetime,'2013-10-17') 
and check_in< CONVERT(datetime,'2013-10-19')
于 2013-10-18T14:15:54.810 回答
4

从 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

于 2017-09-06T14:28:16.393 回答
2

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

  • 2013-10-17' 和 '2013-10-18' 之间没有记录
  • 第二个查询返回的记录存在于“2013-10-18”之后
于 2013-10-18T14:15:42.903 回答
0

您需要将日期字段转换为 varchar 以去除时间,然后将其转换回日期时间,这会将时间重置为“00:00:00.000”。

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

        between 

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

        and  

        convert(datetime,convert(varchar,[EndDate],1))
    )
于 2014-08-22T14:57:44.597 回答