在SQL Server中搜索当前日期的数据

时间:2017-12-02 11:01:08

标签: sql sql-server

为什么第一个查询花费的时间少于SQL Server中的第二个查询?

此查询需要4秒钟才能完成:

select *
from salesinvmaster
where day(salesdate) = day(getdate()) and
      month(salesdate) = month(getdate()) and
      year(salesdate) = year(getdate())

此查询需要10秒钟:

select *
from salesinvmaster
where salesdate between '2017-11-01 00:00:00' and '2017-11-01 23:59:59'

2 个答案:

答案 0 :(得分:4)

这两个问题是不同的,因为今天是12月的某一天,而不是11月1日。

我的猜测是你在salesdate列上没有索引,并且第一个查询返回的行数较少 - 因此,它看起来更快。为了记录,我建议将逻辑编写为以下之一:

where convert(date, salesdate) = convert(date, getdate())

where salesdate >= convert(date, getdate()) and
      salesdate < dateadd(day, 1, convert(date, getdate()))

请注意,SQL Server 使用索引将日期/时间值转换为日期。当函数不阻止使用索引时,这是罕见的(仅?)时间之一。

至于第二种方法,它不需要包括值的时间分量。

答案 1 :(得分:3)

检查查询的执行计划我认为我们在日期有隐式转换!检查一下

enter image description here