我datetime在一个很大的表中有一个SQL字段。它已被索引并需要查询。
datetime
问题在于,SQL总是存储时间成分(即使始终是午夜),但是搜索是针对日期而不是时间。
declare @dateVar datetime = '2013-03-11; select t.[DateColumn] from MyTable t where t.[DateColumn] = dateVar;
不会返回任何内容,因为t.[DateColumn]总是包含时间部分。
t.[DateColumn]
我的问题是最好的解决方法是什么?
似乎有两个主要选项组:
使用创建第二个变量,dateadd并使用between ... and或>= ... and ... <=。
dateadd
between ... and
>= ... and ... <=
将转换t.[DateColumn]为仅日期的组件-我认为这将导致所有索引被忽略。
两者看起来都非常混乱-我真的不想进行范围比较或扫描表格。
有没有更好的办法?
如果这些选项之一始终是最佳方式,那么如何以及为什么呢?
DATE在任何情况下,转换为或使用开放式日期范围都会产生最佳效果。仅供参考,使用索引转换到日期的效果最佳。在文章中更多地测试一种不同的技术:从日期时间削减时间的最有效方法是什么?由亚伦·伯特兰(Aaron Bertrand)发布
DATE
从那篇文章:
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;
同样来自该文章:使用BETWEEN,DATEDIFF或者CONVERT(CHAR(8)...都变慢了。
BETWEEN
DATEDIFF
CONVERT(CHAR(8)...