用日期过滤 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) > @MyDateVariable
和 MyDatetimeCol >= DATEADD(DAY,1,@MyDateVariable)
实际上是同义词,除此之外后者的性能更高。
我有一列是 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) > @MyDateVariable
和 MyDatetimeCol >= DATEADD(DAY,1,@MyDateVariable)
实际上是同义词,除此之外后者的性能更高。