我有一个 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]
进入仅日期组件 - 我认为这会导致任何索引被忽略。
这两个看起来都很困惑 - 我真的不想进行范围比较或扫描表格。
有更好的方法吗?
如果这些选项之一始终是最佳方式,那么如何以及为什么?
最佳答案
在任何情况下转换为 DATE
或使用开放式日期范围都会产生最佳性能。仅供引用,使用索引转换为日期是表现最好的。更多测试不同技术的文章:What is the most efficient way to trim time from datetime?发布者:亚伦·伯特兰
摘自该文章:
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)...
都比较慢。
关于sql - 在 Microsoft SQL Server 中比较日期的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344661/