SQL Server 2008搜索日期

时间:2012-02-06 07:25:06

标签: performance sql-server-2008 date indexing

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

但是,我需要搜索的列的数据类型是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是日期类型,并且无法添加或删除第二个。

有人可以帮我处理工作查询吗?

感谢。

3 个答案:

答案 0 :(得分:2)

我理解使用:

convert(date, Mycolumn) = @selectedDate

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

如果你需要经常进行这些搜索,你可以添加一个计算的,持久化的列,转换为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

由于附加信息存储在表格中,您将使用更多的存储空间 - 因此您正在进行经典的“空间与速度”权衡;你需要更多的空间,但你可以获得更多的速度。