我有一列是datetime2
,我想使用date
变量进行筛选。目前我使用:
where mystringCol in ('x', 'y', 'z') and cast(MyDatetimeCol as date) > @MyDateVariable
。
在执行计划中,它在(mystringCol, MyDatetimeCol)
上的覆盖非聚集索引上使用查找,该索引在include
部分中具有可选列。关于谓词是SARGABLE。因此,即使它做错了所有事情,即使用函数(cast
(和使用in
,它似乎也是严重的?
我还需要cast
吗?
如果您似乎过于复杂了。我能理解为什么要在表达式MyDatetimeCol > @MyDateVariable
中将MyDatetimeCol
强制转换为日期的唯一原因是,当@MyDateVariable
的值为20201103
时,像'2020T-11-03T11:00:00
这样的值会返回false。
如果是的情况,则不使用>
,而是使用>=
,并将@MyDateVariable
的值增加一,那么它是对称的:
DECLARE @MyDateVariable date = '20201104'; --was 20201103 before
SELECT ...
FROM ...
WHERE ...
AND MyDatetimeCol >= @MyDateVariable;
CAST(MyDatetimeCol AS date) > @MyDateVariable
和MyDatetimeCol >= DATEADD(DAY,1,@MyDateVariable)
实际上是同义词,除此之外后者将更具表演性。