SQL WHERE中嵌套的AND / OR

时间:2012-10-15 13:09:46

标签: php sql pdo

我正在尝试使用一些条件来根据开始和结束日期选择记录。基本上我想要任何没有结束日期或者在给定时间段内开始或在同一给定时期内结束的事情。任何有关如何实现这一目标的帮助或指示都将非常感激。我包括下面查询的WHERE部分和参数绑定,但如果需要可以包含更多。

$periodsCxn->bindParam(':PositionID',$PositionID);
$periodsCxn->bindParam(':Start',$firstPayPeriod);
$periodsCxn->bindParam(':End',$lastPayPeriod);
$periodsCxn->bindParam(':Start2',$firstPayPeriod);
$periodsCxn->bindParam(':End2',$lastPayPeriod);

WHERE
        POSITION_PERIOD.PositionID = :PositionID AND
        (
            (
                POSITION_PERIOD.EndDate = '1900-01-01'
                OR
                POSITION_PERIOD.EndDate IS NULL
            )
            OR
            (
                POSITION_PERIOD.StartDate BETWEEN :Start AND :End
                OR
                POSITION_PERIOD.EndDate BETWEEN :Start2 AND :End2
            )
        )       

1 个答案:

答案 0 :(得分:0)

令我惊讶的是,你想要任何没有结束日期的记录,但要比较其他情况下的开始日期。

通常情况下,对于此类数据,您希望知道给定时间段是否与其他时间段重叠,即使该时间段可能没有结束日期。重叠的逻辑是:

where POSITION_PERIOD.PositionID = :PositionID AND
      POSITION_PERIOD.StartDate <= :End and
      (POSITION_PERIOD.EndDate >= :Start or
       POSITION_PERIOD.EndDate = '1900-01-01' or
       POSITION_PERIOD.EndDate IS NULL
      )

这假定变量具有有效日期。