您好我是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
答案 0 :(得分:2)
第二个查询中的问题可能是错误的优先级。请在第二个查询中尝试使用以下WHERE子句:
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)