一尘不染

在Microsoft SQL Server中比较日期的最佳方法是什么?

sql

datetime在一个很大的表中有一个SQL字段。它已被索引并需要查询。

问题在于,SQL总是存储时间成分(即使始终是午夜),但是搜索是针对日期而不是时间。

declare @dateVar datetime = '2013-03-11;

select t.[DateColumn]
from MyTable t
where t.[DateColumn] = dateVar;

不会返回任何内容,因为t.[DateColumn]总是包含时间部分。

我的问题是最好的解决方法是什么?

似乎有两个主要选项组:

  1. 使用创建第二个变量,dateadd并使用between ... and>= ... and ... <=

  2. 将转换t.[DateColumn]为仅日期的组件-我认为这将导致所有索引被忽略。

两者看起来都非常混乱-我真的不想进行范围比较或扫描表格。

有没有更好的办法?

如果这些选项之一始终是最佳方式,那么如何以及为什么呢?


阅读 178

收藏
2021-03-17

共1个答案

一尘不染

DATE在任何情况下,转换为或使用开放式日期范围都会产生最佳效果。仅供参考,使用索引转换到日期的效果最佳。在文章中更多地测试一种不同的技术:从日期时间削减时间的最有效方法是什么?由亚伦·伯特兰(Aaron Bertrand)发布

从那篇文章:

DECLARE @dateVar datetime = '19700204';

-- Quickest when there is an index on t.[DateColumn], 
-- because CONVERT can still use the index.
SELECT t.[DateColumn]
FROM MyTable t
WHERE = CONVERT(DATE, t.[DateColumn]) = CONVERT(DATE, @dateVar);

-- Quicker when there is no index on t.[DateColumn]
DECLARE @dateEnd datetime = DATEADD(DAY, 1, @dateVar);
SELECT t.[DateColumn] 
FROM MyTable t
WHERE t.[DateColumn] >= @dateVar AND 
      t.[DateColumn] < @dateEnd;

同样来自该文章:使用BETWEENDATEDIFF或者CONVERT(CHAR(8)...都变慢了。

2021-03-17