Sql 在没有函数的WHERE子句中比较日期的最佳方法是什么?
我正在查看继承的脚本,并在WHERE子句中找到:Sql 在没有函数的WHERE子句中比较日期的最佳方法是什么?,sql,sql-server,function,datetime,Sql,Sql Server,Function,Datetime,我正在查看继承的脚本,并在WHERE子句中找到: WHERE CONVERT(DATE, changedon) = CONVERT(DATE, DATEADD(DAY, -1, GETDATE())) 这是获取changedon=前一天日期的所有记录 我知道你不应该在WHERE子句中使用函数,所以我想知道如何重写它。“changedon”字段是一个日期/时间字段,因此我不知道如何在不使用CONVERT或CAST的情况下执行此操作。实际上,在这种情况下使用函数是可以的。问题在于S
WHERE
CONVERT(DATE, changedon) = CONVERT(DATE, DATEADD(DAY, -1, GETDATE()))
这是获取changedon=前一天日期的所有记录
我知道你不应该在WHERE子句中使用函数,所以我想知道如何重写它。“changedon”字段是一个日期/时间字段,因此我不知道如何在不使用CONVERT或CAST的情况下执行此操作。实际上,在这种情况下使用函数是可以的。问题在于SQL Server是否将使用索引,它将日期/时间强制转换为日期是一个例外。我认为这是唯一的例外 您还可以将其改写为:
WHERE changedon >= CONVERT(DATE, DATEADD(DAY, -1, GETDATE())) AND
changedon < CONVERT(DATE, GETDATE())
WHERE changedon>=CONVERT(日期,DATEADD(DAY,-1,GETDATE())和
changedon
实际上,在这种情况下使用函数是可以的。问题在于SQL Server是否将使用索引,它将日期/时间强制转换为日期是一个例外。我认为这是唯一的例外
您还可以将其改写为:
WHERE changedon >= CONVERT(DATE, DATEADD(DAY, -1, GETDATE())) AND
changedon < CONVERT(DATE, GETDATE())
WHERE changedon>=CONVERT(日期,DATEADD(DAY,-1,GETDATE())和
changedon
当您希望在sql查询中筛选字段时,如果您在字段上使用函数,则数据库必须处理all记录并应用函数以获得结果。这种方法成本很高,甚至索引字段的速度也很慢。获得最佳结果的最佳方法是使用筛选值中的函数
例如:
Select * from mytable t where t.field-1 = x
数据库必须处理mytable中的所有记录。
最佳查询:
Select * from mytable t where t.field = x+1
我希望这很有用。当您想在sql查询中筛选字段时,如果您在字段上使用函数,数据库必须处理all记录并应用函数以获得结果。这种方法成本很高,甚至索引字段的速度也很慢。获得最佳结果的最佳方法是使用筛选值中的函数 例如:
Select * from mytable t where t.field-1 = x
数据库必须处理mytable中的所有记录。
最佳查询:
Select * from mytable t where t.field = x+1
我希望这很有用。在列上使用函数通常是个问题,因为这会使它变得不可搜索。但是,在函数上使用它们,如
GETDATE
不是问题,因为GETDATE
上没有索引。我理解将函数与GETDATE一起使用是可以的,因为这不是一列。但是,将它与ChangedOn字段一起使用可以吗,还是重写它更好?@jackstraw22我的评论在上面解释了这一点。@Lamu——我的评论实际上是指Gordon的回答,他在回答中写道:“将日期时间转换为日期是一个例外。”这是RN,而不是M。在列上使用函数通常是个问题,因为它使它不可出售。但是,在函数上使用它们,如GETDATE
不是问题,因为GETDATE
上没有索引。我理解将函数与GETDATE一起使用是可以的,因为这不是一列。但是,将它与ChangedOn字段一起使用可以吗,还是重写它更好?@jackstraw22我的评论在上面解释了这一点。@Lamu——我的评论实际上是指Gordon的回答,他在回答中写道:“将日期时间转换为日期是一个例外。”它是RN,而不是M。