Mysql 返回错误值的存储过程?

Mysql 返回错误值的存储过程?,mysql,sql,sql-server,stored-procedures,Mysql,Sql,Sql Server,Stored Procedures,我有一个存储过程,用于检查数据库中已预订的假期,它不应考虑状态为“已拒绝”或“已取消”的假期,但我的数据库中只有一条状态为“已拒绝”的记录,但此select语句返回1 SELECT COUNT(*) JobRoleID FROM Employees RIGHT JOIN Holidays ON Employees.ID = Holidays.EmployeeID WHERE

我有一个存储过程,用于检查数据库中已预订的假期,它不应考虑状态为“已拒绝”或“已取消”的假期,但我的数据库中只有一条状态为“已拒绝”的记录,但此select语句返回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')
选择计数(*)JobRoleID
来自员工
右键连接假日
ON Employees.ID=假日.EmployeeID
其中假日。状态为“已拒绝”和假日。状态为“已取消”
和(Holidays.Startdate='2014/04/30')

或者(Holidays.Startdate>='2014/04/28'和Holidays.Enddate此处需要考虑运算符优先级

Not -->  AND --> OR 
Not优先于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')
    )
其中假日。[状态]“已拒绝”和假日。[状态]“已取消”
及
((Holidays.Startdate='2014/04/30')
或(Holidays.Startdate>='2014/04/28'和Holidays.Enddate
被视为

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
选择计数(*)JobRoleID
来自员工
右键连接假日
ON Employees.ID=假日.EmployeeID
其中假日。状态为“已拒绝”和假日。状态为“已取消”

和Holidays.StartDate返回此行的假期状态如何?没问题,很高兴它有帮助:)谢谢帮助:)
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