【发布时间】:2014-10-15 13:28:43
【问题描述】:
我正在尝试在我的 SQL 存储过程的 WHERE 子句中使用 Datediff/DateAdd 函数。除了其他主查询,我的查询包含 2 个日期列和 1 个主列:-
WHERE DATE1 BETWEEN @MonthStart AND @MonthEnd
AND "MAINCOLUMN" IS NOT NULL
OR "DATE2" <= DATEADD(MM, -36,GETDATE()) AND "MAINCOLUMN" IS NOT NULL
我想返回MainColumn Date1 位于@MonthStart 和@MonthEnd 之间的那些行
或者
MainColumn 的 Date2 列 DATE 在过去 36 个月之间(从今天的日期到过去 3 年的日期)
我什至尝试过:
WHERE "DATE1" BETWEEN @MonthStart AND @MonthEnd
AND "MAINCOLUMN" IS NOT NULL
OR "DATE2" BETWEEN DATEDIFF(MM, -36, GETDATE()) AND GETDATE()
AND "MAINCOLUMN" IS NOT NULL
还有:
WHERE "DATE1" BETWEEN @MonthStart AND @MonthEnd
AND "MAINCOLUMN" IS NOT NULL
OR DATEDIFF(MM, DATE2, GETDATE()) <= 36 AND "MAINCOLUMN" IS NOT NULL
问题是,一切都在运行,但它们需要很长时间才能运行。在 WHERE 子句中添加 OR 语句之前,我的报告几乎不需要 4-5 分钟即可运行,尽管它有近 200,000 行但是在添加了OR 语句之后,它就一直在继续。
【问题讨论】:
-
您需要检查执行计划。我猜想在您添加第二个条件之前,它可能已经能够使用
Date1上的索引,但现在它可能已被强制执行表扫描。 -
是的,我在提问之前也这样做了,但是我的查询非常复杂,所以基本上这对我没有帮助:(
标签: sql sql-server sql-server-2005 sql-server-2012