用日期过滤 datetime2 的最佳方法

Best way to filter datetime2 with a date

我有一列是 datetime2,我想使用 date 变量进行过滤。目前我使用:

where mystringCol in ('x', 'y', 'z') and cast(MyDatetimeCol as date) > @MyDateVariable.

在执行计划中,它在 (mystringCol, MyDatetimeCol) 上的覆盖非聚集索引上使用查找,该索引在 include 部分中有多个列。 关于谓词是 SARGABLE。所以它似乎是 SARGABLE 即使它做错了一切,即使用函数 (cast) 并使用 in?

我还需要 cast 吗?

如果你似乎把这里的事情复杂化了。我能理解为什么要在表达式 MyDatetimeCol > @MyDateVariable 中投射 MyDatetimeCol 日期的唯一原因是 '2020T-11-03T11:00:00 returns 之类的值在 @MyDateVariable 具有值 20201103.

如果 的情况,而不是使用 > 使用 >= 并将 @MyDateVariable 的值增加一,然后它在语义上是相同的:

DECLARE @MyDateVariable date = '20201104'; --was 20201103 before

SELECT ...
FROM ...
WHERE ...
  AND MyDatetimeCol >= @MyDateVariable;

CAST(MyDatetimeCol AS date) > @MyDateVariableMyDatetimeCol >= DATEADD(DAY,1,@MyDateVariable) 实际上是同义词,除此之外后者的性能更高。