我有一个非常大的表,其中包含一个SQL datetime
字段。该字段已经被索引并需要进行查询。
问题在于SQL始终存储时间组件(即使它总是午夜),但搜索是按天而不是时间进行的。
declare @dateVar datetime = '2013-03-11;
select t.[DateColumn]
from MyTable t
where t.[DateColumn] = dateVar;
由于t.[DateColumn]
始终包含时间组件,因此不会返回任何内容。
我的问题是如何解决这个问题?
似乎有两大主要选项:
使用
dateadd
创建第二个变量,并使用between ... and
或>= ... and ... <=
。将
t.[DateColumn]
转换为仅包含日期的组件 - 我认为这将导致忽略任何索引。
这两种方法都非常混乱 - 我真的不想进行范围比较或扫描表。
是否有更好的方法?
如果其中一种选项始终是最佳方式,那么如何以及为什么?
datediff
计算,这肯定不是最快或最有效的方法。选项#2也是如此,因为它需要进行varchar(20)
转换。选项#4和#5更有前途,我还会添加两个:6)where OrderDate between @dateVar and dateadd(day, 1, @dateVar)
和7)WHERE convert(date, OrderDate) = @dateVar
。 - Keithconvert(date, OrderDate)
,详见所选答案)甚至不在列表中。 - Keith