没有功能的WHERE子句中比较日期的最佳方法是什么?

时间:2018-06-27 20:03:10

标签: sql sql-server function datetime

我正在查看一个我继承的脚本,并在WHERE子句中找到了它:

  WHERE
    CONVERT(DATE, changedon) = CONVERT(DATE, DATEADD(DAY, -1, GETDATE()))  

这将获取所有记录,其中changeon =前一天的日期。

我知道您不应该在WHERE子句中使用函数,因此我试图弄清楚如何重写它。 “ changedon”字段是日期/时间,因此我对如何使用CONVERT或CAST做到这一点感到困惑。

2 个答案:

答案 0 :(得分:3)

实际上,在这种情况下可以使用函数。问题在于SQL Server是否将使用索引,并且将日期/时间转换为日期是一个例外。我认为这是唯一的例外。

您也可以将其重写为:

WHERE changedon >= CONVERT(DATE, DATEADD(DAY, -1, GETDATE()))  AND
      changedon < CONVERT(DATE, GETDATE())

答案 1 :(得分:0)

当您要在sql查询中过滤字段时,如果在字段上使用函数,则数据库必须处理所有记录并应用函数以获得结果。这种方式花费很多,并且即使索引字段也非常慢。获得最佳结果的最佳方法是使用过滤器值中的功能 例如:

Select * from mytable t where t.field-1 = x

数据库必须处理mytable中的所有记录。 最佳查询:

Select * from mytable t where t.field = x+1

我希望这很有用。