在 SQL Server 数据库中按日期搜索的最有效方法

vik*_*gla 0 sql t-sql sql-server query-optimization

在 SQL Server 数据库中,我有一个包含一DateTime列的表,我想获取特定日期的行。

我发现了很多选择,例如:

  1. WHERE myColumn BETWEEN '2020-10-10T00:00:00.00' AND '2020-10-10T23:59:59.999'
  2. WHERE CAST(myColumn AS date) = '2020-10-10'
  3. WHERE date LIKE '%2020-10-10%'

...

其中哪一个最快?

Cha*_*ace 7

正如 @marc_s 所提到的:这些选项都不正确。

  • WHERE myColumn BETWEEN '2020-10-10T00:00:00.00' AND '2020-10-10T23:59:59.999'
    此选项不能正确处理终点。对于datetime值,您将得到一个舍入误差,其中包括第二天的开始时间,并且datetime2您将错过 1 毫秒。
  • WHERE CAST(myColumn AS date) = '2020-10-10'
    尽管编译器对此选项进行了一些处理,但该选项在一定程度上阻碍了索引的正确使用。基数估计几乎肯定会失败。
  • WHERE date LIKE '%2020-10-10%'
    这是最糟糕的:它将日期转换为字符串,完全阻止了索引的使用。

你真正需要的是:

WHERE myColumn >= '2020-10-10' AND myColumn < '2020-10-11'
Run Code Online (Sandbox Code Playgroud)

这涵盖了一个日期范围并允许在该范围内进行索引查找。另请参见BETWEEN 和魔鬼有什么共同点?

显然,您仍然需要日期列上的索引,但由于我们看不到查询的其余部分或表定义,因此我们无法提供帮助。