Sql 筛选日期时间截止日期时,我没有得到任何结果

Sql 筛选日期时间截止日期时,我没有得到任何结果,sql,sql-server,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 --------------- ----------------------- 16

我有这样的疑问:

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'

有什么问题吗?这次我想得到同样的结果。

这是因为
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))
在哪里
transDateTime>=转换('20150507'作为日期时间)
和transDateTime
这是因为
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))
在哪里
transDateTime>=转换('20150507'作为日期时间)
和transDateTime
试试这个

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

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

你最好两面都投

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

你最好两面都投

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

第二个查询将不起作用,因为
'2015-05-07'
将转换为datetime作为
'2015-05-07 00:00:00.000'
,然后进行比较以确定是否完全相等

这里建议的其他解决方案是在
transDateTime
列上使用cast,但也有一个缺点:您将无法在查询中使用涉及该列的索引。因此,如果该表中有大量数据(假设有数百万行),那么最好坚持使用第一个解决方案,该解决方案更详细,但性能要好得多(如果您对该列进行了索引)。对正确性的轻微修改:

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'
选择empid,transDateTime
来自Trans_详细信息
其中empId='16510'
和transDateTime>=“2015-05-07 00:00:00.000”
和transDateTime<'2015-05-08 00:00:00.000'

第二个查询将不起作用,因为
'2015-05-07'
将转换为日期时间为
'2015-05-07 00:00:00.000'
,然后比较是否完全相等

这里建议的其他解决方案是在
transDateTime
列上使用cast,但也有一个缺点:您将无法在查询中使用涉及该列的索引。因此,如果该表中有大量数据(假设有数百万行),那么最好坚持使用第一个解决方案,该解决方案更详细,但性能要好得多(如果您对该列进行了索引)。对正确性的轻微修改:

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'
选择empid,transDateTime
来自Trans_详细信息
其中empId='16510'
和transDateTime>=“2015-05-07 00:00:00.000”
和transDateTime<'2015-05-08 00:00:00.000'

这一次我如何从这个日期获取vale?我会给你-1作为第一个解决方案,给你+1作为“替代方法”。在筛选的字段上放置函数是不好的做法。但正如@StuartLC在下面指出的那样,
转换(日期,…)
自动转换为
@1
转换
日期
SARGABLE
。看。这一次我如何从这个日期取vale?我给你-1作为第一个解决方案,+1作为“替代方法”。在筛选的字段上放置函数是不好的做法。但正如@StuartLC在下面指出的那样,
转换(日期,…)
自动转换为
@1
转换
日期
SARGABLE
。请参阅。不要与
='2015-05-07'和Td.transDateTime<'2015-05-08'
进行比较。不要与
='2015-05-07'和Td.transDateTime<'2015-05-08'
转换(日期,…)
是为数不多的(?单调的)之一,但一般来说,将函数应用于谓词中的列不是一个好主意。
转换(日期,…)
是为数不多的(?单调)函数之一,但一般来说,将函数应用于谓词中的列不是一个好主意。