Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在没有函数的WHERE子句中比较日期的最佳方法是什么?_Sql_Sql Server_Function_Datetime - Fatal编程技术网

Sql 在没有函数的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子句中找到:

  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。