Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/84.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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子句中的Datediff_Sql_Sql Server_Sql Server 2005_Sql Server 2012 - Fatal编程技术网

Sql where子句中的Datediff

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 以及: 问题是,所有的东西都在运转,但它们需

我试图在我的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子句中添加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