我正在查看一个我继承的脚本,并在WHERE子句中找到了它:
WHERE
CONVERT(DATE, changedon) = CONVERT(DATE, DATEADD(DAY, -1, GETDATE()))
这将获取所有记录,其中changeon =前一天的日期。
我知道您不应该在WHERE子句中使用函数,因此我试图弄清楚如何重写它。 “ changedon”字段是日期/时间,因此我对如何使用CONVERT或CAST做到这一点感到困惑。
答案 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
我希望这很有用。