我需要搜索在特定日期输入的行。
但是,我需要搜索的列的数据类型是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 :(得分: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
由于附加信息存储在表格中,您将使用更多的存储空间 - 因此您正在进行经典的“空间与速度”权衡;你需要更多的空间,但你可以获得更多的速度。