使用运算符SQL Server之间选择记录

时间:2014-07-08 07:06:38

标签: sql sql-server

我在为我的要求编写最佳存储过程时感到困惑。

我正根据StartDateEndDate过滤记录。

所以我希望得到StartDateEndDates介于StartDate&之间的记录。 EndDate范围。

以前我在SE中问了这个问题Here,并得到了一些答案。但后来我发现查询没有给我正确的结果。

所以我找到的答案是:

 select * 
 from tbl 
 Where (Event_Startdate between @StartDate and @EndDate) 
   and (Event_Enddate between @StartDate and @EndDate)

假设我有记录:

enter image description here

如果我使用以下输入执行上述查询:

    @StartDate = '1/1/2000',
    @EndDate = '5/16/2014',

上面的查询没有提供任何记录...因为此处Event_StartDate位于StartDateEndDate之间,其中结束日期不在范围之间。

但我想要的是如果StartDateEndDate介于范围之间,那么应该选择它。

然后我立刻想到了OR运算符,我尝试在查询中更改And到OR

select * 
from tbl 
Where (Event_Startdate between @StartDate and @EndDate) 
   OR (Event_Enddate between @StartDate and @EndDate)

在这种情况下,它给出了正确的答案。

但是这个问题的问题在于它没有检查第二个条件,即在' OR'之后。如果第一个条件为真。假设我输入的是:

    @StartDate = '1/1/2000',
    @EndDate = '7/25/2014'

它将选择表中的所有记录,因为StartDate在1/1/2000到7/25/2014之间,这是真的,因此它不检查EndDate是否在范围之间,它确实是&#39 ;关心EndDate。

我希望我的问题很清楚。请有人帮忙...

5 个答案:

答案 0 :(得分:0)

这肯定会有用

select * 
from tbl 
Where ( @StartDate between Event_Startdate and Event_Enddate 
        or Event_Startdate between @StartDate and @EndDate) 
 and ( @EndDate between Event_Startdate and Event_Enddate   
       or Event_Enddate between @StartDate and @EndDate)

答案 1 :(得分:0)

试试这个

select * from (
select * from tbl Where Event_Startdate between @StartDate and @EndDate
) AS A
Where Event_Enddate between @StartDate and @EndDate

答案 2 :(得分:0)

如果您希望范围的行完全在指定范围的边界内,请指定Event_Startdate不早于@StartDateEvent_Enddate不晚于@EndDate

WHERE Event_Startdate >= @StartDate
  AND Event_Enddate   <= @EndDate

答案 3 :(得分:0)

如果您需要在Event Startdate和Event Enddate中过滤所有重叠间隔(内部和外部)和optionaly以及NULL,请尝试以下操作:

select * 
 from tbl 
 Where 
 1=CASE WHEN Event_Startdate IS NOT NULL AND Event_Enddate IS NOT NULL THEN
            CASE WHEN @StartDate<=Event_Startdate AND @EndDate>=Event_Enddate THEN 1
                 WHEN @StartDate>=Event_Startdate AND @EndDate<=Event_Enddate THEN 1
                 WHEN @StartDate<=Event_Startdate AND @EndDate BETWEEN Event_Startdate AND Event_Enddate THEN 1
                 WHEN @EndDate>=Event_Enddate AND @StartDate BETWEEN Event_Startdate AND Event_Enddate THEN 1
                ELSE 0 END
    WHEN Event_Startdate IS NULL AND Event_Enddate IS NOT NULL AND @StartDate<=Event_Enddate THEN 1
    WHEN Event_Enddate IS NULL AND Event_Startdate IS NOT NULL AND @EndDate>=Event_Startdate THEN 1
  ELSE 0 END

答案 4 :(得分:-1)

你可以在数据中看到:

你的日期不同。

db中的

 'yyyy/mm/dd'

你的变量是

  'dd/mm/yyyy'