我正在尝试优化几个查询,这些查询都在其中一个WHERE
子句上使用类似的模式:
AND (DATEADD(DAY
, ISNULL(a.[due_days], 30) + 30
, [dbo].[CalcDate]([type], date1, date2, date3, date4, NULL))
) < GETDATE()
CalcDate
基于type
字段值的udf做一些比较,返回一个日期。然后将天数添加到该日期并与当前日期进行比较。为了能够在due_days
我想转换操作上使用现有索引以将所有转换应用到GETDATE()
,假设我想在sargable
可能的情况下进行转换。另外,如果有一些建议可以做些什么来更好地改进 udf 的使用。
进行这种转换并不难。一步步:
方法:
那么我们必须将其
ISNULL()
分为两种情况:可以写成:
所以我们可以使用
DATEDIFF()
:最后:
更正,注意时间部分:
您可以使用以下方法稍微简化一下
CROSS APPLY
: