虽然过滤日期时间到期没有得到任何结果

时间:2015-07-09 06:39:34

标签: sql sql-server

我有这样的查询:

select empid,transDateTime
from Trans_Details
where empId='16510'
  and transDateTime >='2015-05-07 00:00:00.000'
  and transDateTime< ='2015-05-07 23:59:59.000'

我得到这样的输出:

empid           transDateTime
--------------- -----------------------
16510           2015-05-07 08:51:56.000   

我有相同的查询没有时间,但那个没有返回任何结果:

select empid, transDateTime
from Trans_Details Td
where td.empId='16510'
  and Td.transDateTime='2015-05-07'

问题是什么?这次我希望得到相同的结果。

4 个答案:

答案 0 :(得分:2)

这是因为transDateTime属于DATETIME类型。在WHERE条款中,2015-05-07转换为DATETIME,从而产生2015-05-07 00:00:00.000

您可以改用:

WHERE CAST(transDateTime AS DATE) = '20150507'

请注意,您应该使用YYYYMMDD格式作为日期文字。

另一种避免在WHERE子句左侧使用函数的方法是:

WHERE 
    transDateTime >= CAST('20150507' AS DATETIME)
    AND transDateTime < DATEADD(DAY, 1, CAST('20150507' AS DATETIME))

答案 1 :(得分:2)

试试这个

select empid,transDateTime from Trans_Details Td where td.empId='16510' 
and convert(date,Td.transDateTime)='2015-05-07'  

答案 2 :(得分:0)

更好的是你可以双方CAST

WHERE CAST(transDateTime AS DATE) = CAST('2015-05-07' AS DATE)

答案 3 :(得分:0)

第二个查询将无效,因为'2015-05-07'将转换为日期时间'2015-05-07 00:00:00.000',然后进行比较以确保相等。

此处建议使用强加于transDateTime列的其他解决方案可行,但有一个缺点:您无法使用涉及该列的索引进行查询。因此,如果您在该表中有大量数据(想想数百万行),那么最好坚持使用更加冗长的第一个解决方案,但性能更好(如果您已对该列编制索引)。略微修改正确性:

select empid, transDateTime
from Trans_Details
where empId = '16510'
  and transDateTime >= '2015-05-07 00:00:00.000'
  and transDateTime <  '2015-05-08 00:00:00.000'