【发布时间】:2014-03-21 09:20:02
【问题描述】:
您好,我对 SQL 比较陌生,所以这可能是一个基本问题。我正在尝试传递一个变量并使用该变量内容来确定它运行的内容。变量是char(2),它可以有以下可能的值:
接受
= AP
全部
= AL
拒绝
= DE
接受直线经理
= LA
已接受管理员
= AA
这是它应该做的。我应该输入开始日期和结束日期,然后输入两位数代码来决定我选择哪些假期预订。在下面的示例中,我正在寻找具有任何状态(接受或拒绝)的 2 个假期之间的日期范围:
EXEC spSearchHoliday '2013-04-01','2015-05-24','PE'
这会返回正确的结果!但是,如果我尝试在具有任何其他状态的两个日期之间运行日期搜索,它将继续返回每个日期。在下面的示例中,我只想返回接受的假期:
EXEC spSearchHoliday '2013-04-01','2015-05-24','AP'
但它仍然返回范围之间的每个状态假期。
下面是存储过程本身,很长的holidays.startdate 和holidays.EndDate 部分工作正常,只是与状态相关的部分工作不正常。
AS
BEGIN
IF @Status = 'AL'
BEGIN
SELECT StartDate,
EndDate,
Duration,
[Status]
FROM Holidays
WHERE Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @EndDate
OR Holidays.Startdate >= @Startdate AND Holidays.Enddate <= @EndDate
OR Holidays.Startdate <= @Enddate AND Holidays.Enddate >= @EndDate
OR Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @Startdate
END
IF @Status <> 'AL'
BEGIN
SELECT StartDate,
EndDate,
Duration,
[Status]
FROM Holidays
WHERE Holidays.Status = @Status
AND Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @EndDate
OR Holidays.Startdate >= @Startdate AND Holidays.Enddate <= @EndDate
OR Holidays.Startdate <= @Enddate AND Holidays.Enddate >= @EndDate
OR Holidays.Startdate <= @Startdate AND Holidays.Enddate >= @Startdate
END
END
【问题讨论】:
-
结合AND和OR时,我个人不想记住哪个优先级更高。我总是使用方括号
( )来明确(对我或维护我的代码的人)什么在什么之前。
标签: sql sql-server select stored-procedures where