用日期筛选datetime2的最佳方式



我有一列是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) > @MyDateVariableMyDatetimeCol >= DATEADD(DAY,1,@MyDateVariable)实际上是同义词,除此之外后者将更具表演性。

最新更新