我在为我的要求编写最佳存储过程时感到困惑。
我正根据StartDate
和EndDate
过滤记录。
所以我希望得到StartDate
和EndDates
介于StartDate
&之间的记录。 EndDate
范围。
以前我在SE中问了这个问题Here,并得到了一些答案。但后来我发现查询没有给我正确的结果。
所以我找到的答案是:
select *
from tbl
Where (Event_Startdate between @StartDate and @EndDate)
and (Event_Enddate between @StartDate and @EndDate)
假设我有记录:
如果我使用以下输入执行上述查询:
@StartDate = '1/1/2000',
@EndDate = '5/16/2014',
上面的查询没有提供任何记录...因为此处Event_StartDate
位于StartDate
和EndDate
之间,其中结束日期不在范围之间。
但我想要的是如果StartDate
或EndDate
介于范围之间,那么应该选择它。
然后我立刻想到了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。
我希望我的问题很清楚。请有人帮忙...
答案 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
不早于@StartDate
且Event_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'