存储过程返回错误值?
Posted
技术标签:
【中文标题】存储过程返回错误值?【英文标题】:Stored procedure returning the wrong value? 【发布时间】:2014-05-15 09:17:04 【问题描述】:我有一个存储过程来检查我的数据库中已预订的假期,它不应该考虑状态为“已拒绝”或“已取消”的假期,但我的数据库中只有一条记录具有拒绝状态,但此选择语句返回 1?
SELECT COUNT(*) JobRoleID
FROM Employees
RIGHT JOIN Holidays
ON Employees.ID = Holidays.EmployeeID
WHERE Holidays.Status <> 'Declined' AND Holidays.Status <> 'Cancelled'
AND (Holidays.Startdate <= '2014/04/28' AND Holidays.Enddate >= '2014/04/30')
OR (Holidays.Startdate >= '2014/04/28' AND Holidays.Enddate <= '2014/04/30')
OR (Holidays.Startdate <= '2014/04/30' AND Holidays.Enddate >= '2014/04/30')
OR (Holidays.Startdate <= '2014/04/28' AND Holidays.Enddate >= '2014/04/28')
OR (Holidays.StartDate = '2014/04/28' AND Holidays.EndDate = '2014/04/30')
【问题讨论】:
此行返回的假期状态如何? 【参考方案1】:此处需要考虑运算符优先级。
Not --> AND --> OR
Not 优先于 AND,AND 优先于 OR。对于这些嵌套的 AND 和 OR,最好将它们放在括号中。
WHERE Holidays.[Status] <> 'Declined' AND Holidays.[Status] <> 'Cancelled'
AND
( (Holidays.Startdate <= '2014/04/28' AND Holidays.Enddate >= '2014/04/30')
OR (Holidays.Startdate >= '2014/04/28' AND Holidays.Enddate <= '2014/04/30')
OR (Holidays.Startdate <= '2014/04/30' AND Holidays.Enddate >= '2014/04/30')
OR (Holidays.Startdate <= '2014/04/28' AND Holidays.Enddate >= '2014/04/28')
OR (Holidays.StartDate = '2014/04/28' AND Holidays.EndDate = '2014/04/30')
)
如果在 sql 中使用方括号 []
时,也要避免使用 Sql server 关键字作为列名。
【讨论】:
没问题,很高兴它有帮助:)【参考方案2】:WHERE A AND B AND C OR D AND E OR F AND G
被视为相同
WHERE (A AND B AND C) OR (D AND E) OR (F AND G)
因此,如果除第一个日期比较之外的任何日期比较实际上是真的,那么整个 WHERE
子句就满足了。
顺便说一下,您似乎正在尝试找出两个日期范围是否重叠,并且是在非常复杂的情况下进行的。您应该只需要进行两次比较。两个日期范围重叠,如果:
第一个范围在第二个范围结束之前开始,并且 第二个范围在第一个范围结束之前开始所以,类似:
SELECT COUNT(*) JobRoleID
FROM Employees
RIGHT JOIN Holidays
ON Employees.ID = Holidays.EmployeeID
WHERE Holidays.Status <> 'Declined' AND Holidays.Status <> 'Cancelled'
AND Holidays.StartDate <= '20140430' AND '20140428' <= Holidays.EndDate
应该相当于你的多重比较。
【讨论】:
感谢您的帮助:)以上是关于存储过程返回错误值?的主要内容,如果未能解决你的问题,请参考以下文章