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

标签 sql sql-server tsql datetime query-optimization

我有一个 SQL datetime一个非常大的表中的字段。已建立索引,需要查询。

问题在于 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]进入仅日期组件 - 我认为这会导致任何索引被忽略。

这两个看起来都很困惑 - 我真的不想进行范围比较或扫描表格。

有更好的方法吗?

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

最佳答案

在任何情况下转换为 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;

同样来自那篇文章:使用 BETWEENDATEDIFFCONVERT(CHAR(8)... 都比较慢。

关于sql - 在 Microsoft SQL Server 中比较日期的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15344661/

相关文章:

sql - 我们可以在下拉列表的末尾设置静态值吗?

c# - 在 SQL 中重新创建 .NET 舍入行为

sql-server - 在 sql-server 中查询所有记录都是真实的 - 明智地投入昂贵的性能

sql - GraphQL & Sequelize : Users and followers/following

mysql - 如何从一个表中过滤掉其id出现在另一个表的列中的记录

sql - 使用 SQL 在每第 n 次出现分隔符后将字符串拆分为单独的列,并根据需要添加默认值

sql-server - SQL转置数据

sql - 下个月的第一天

mysql 计数不能正常工作?

sql - *= 是哪个比较运算符