SQL Server 2008搜索日期

问题描述:

我需要搜索在特定日期输入的行。SQL Server 2008搜索日期

但是,我需要搜索的列的数据类型是datetime,而参数的数据类型是Date

我可以使用查询像

Select result 
from table 
where 
    convert(date, Mycolumn) = @selectedDate 

,但会影响查询的SARGability并不会使用在mycolumn创建的索引。

我尝试使用下面的查询:

Select result 
from table 
where 
    Mycolumn 
     BETWEEN @selectedDate AND Dateadd(s, -1, Dateadd(D, 1, @selectedDate)) 

然而,这并不工作,因为@selectedDate是日期型,第二,不能添加或删除。

有人可以帮我一个工作查询吗?

谢谢。

+0

看看这里:[http://*.com/questions/4156011/how-to-select-rows-for-a-specific-date-ignoring-time] [1] – ParPar 2012-02-06 07:29:54

Select result 
from table 
where 
    Mycolumn >= @selectedDate 
AND Mycolumn < Dateadd(D, 1, @selectedDate) 
+0

谢谢!这将做我想要的:) – IamCP 2012-02-06 17:20:59

如果你需要做这些搜索了很多,你可以添加一个计算,坚持执行转换到DATE柱,把一个指标就可以了,然后在该列

ALTER TABLE dbo.YourTable 
ADD DateOnly AS CAST(MyColumn AS DATE) PERSISTED 

搜索由于它是持续的,所以只有在MyColumn值发生变化时才会(重新)计算,例如它不是对存储函数的“隐藏”调用。由于它的持续存在,它也可以被索引并使用就像任何其他的定期专栏:

CREATE NONCLUSTERED INDEX IX01_YourTable_DateOnly ON dbo.YourTable(DateOnly) 

然后执行:

SELECT result FROM dbo.YourTable WHERE DateOnly = @SelectedDate 

由于额外的信息被存储在表中,你会使用更多的存储空间 - 因此您正在进行经典的“空间与速度”折衷;你需要更多的空间,但你的速度会更快。

这是我的理解是使用:

convert(date, Mycolumn) = @selectedDate 

是优化搜索。它将使用Mycolumn上的索引(如果存在)。这可以通过使用执行计划轻松确定。