Sql where子句中的Datediff
我试图在我的SQL存储过程的WHERE子句中使用Datediff/DateAdd函数。除其他主查询外,“我的查询”包含2个日期列和1个主列:-Sql where子句中的Datediff,sql,sql-server,sql-server-2005,sql-server-2012,Sql,Sql Server,Sql Server 2005,Sql Server 2012,我试图在我的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 以及: 问题是,所有的东西都在运转,但它们需
WHERE DATE1 BETWEEN @MonthStart AND @MonthEnd
AND "MAINCOLUMN" IS NOT NULL
OR "DATE2" <= DATEADD(MM, -36,GETDATE()) AND "MAINCOLUMN" IS NOT NULL
以及:
问题是,所有的东西都在运转,但它们需要很长时间才能运转。。在WHERE子句中添加OR语句之前,我的报告几乎不需要4-5分钟就可以运行,尽管它有近200000行,但在添加OR语句之后,它会继续运行。您需要确保逻辑正确分组。尝试:
`WHERE
(
"DATE1" BETWEEN @MonthStart AND @MonthEnd
AND "MAINCOLUMN" IS NOT NULL
) OR (
DATEDIFF(MM, DATE2, GETDATE()) <= 36
AND "MAINCOLUMN" IS NOT NULL
)`
我将节包装在或的两侧,以确保在任何一个块为真时它都会触发。Parathensis!在这两种情况下,MainColumn必须为非null。您可以简化WHERE子句,如下所示:
WHERE MainColumn IS NOT NULL
AND (DATE1 BETWEEN @MonthStart AND @MonthEnd OR DATE2 <= DATEADD(MM, -36,GETDATE()))
这可能会帮到你
CREATE TABLE data
(
id uniqueidentifier primary key,
MainColumn varchar(20),
date1 datetime,
date2 datetime
);
declare @MonthStart int;
Declare @MonthEnd int;
set @MonthStart = 4;
set @MonthEnd = 8;
Select * from data WHERE DATE1 BETWEEN @MonthStart AND @MonthEnd
AND MAINCOLUMN IS NOT NULL
OR DATE2 <= DATEADD(MM, -36,GETDATE()) AND data.MainColumn IS NOT NULL
你需要检查执行计划。我猜在你加入第二个条件之前,它可能已经能够在Date1上使用索引,但现在它可能被迫执行表扫描。是的,我在提问之前也这样做了,但我的查询非常复杂,所以基本上对我没有帮助:虽然这很清楚,但它不应该是一个问题,因为它的优先级高于或。无论如何,它都解决不了问题。我刚刚尝试过分组并再次运行查询。。让我们看看需要多长时间:非常感谢。。这个对我有帮助。。报告运行大约需要7到8分钟,但随着记录数增加到40多万条,运行时间仍然可以。。为什么将MonthStart和MonthEnd声明为int,为什么将它们初始化为4和8??MonthStart和MonthEnd是我报表上的过滤器,作为用户在运行时输入的日期范围。我声明它们只是为了保留原始查询的文本。。。您将提供它们作为命令对象上的参数,我可以想象。。。
WHERE MainColumn IS NOT NULL
AND (DATE1 BETWEEN @MonthStart AND @MonthEnd OR DATE2 <= DATEADD(MM, -36,GETDATE()))
CREATE TABLE data
(
id uniqueidentifier primary key,
MainColumn varchar(20),
date1 datetime,
date2 datetime
);
declare @MonthStart int;
Declare @MonthEnd int;
set @MonthStart = 4;
set @MonthEnd = 8;
Select * from data WHERE DATE1 BETWEEN @MonthStart AND @MonthEnd
AND MAINCOLUMN IS NOT NULL
OR DATE2 <= DATEADD(MM, -36,GETDATE()) AND data.MainColumn IS NOT NULL