2012-10-15 39 views
0

我想用几个条件来选择基于开始和结束日期的记录。基本上我想要什么都没有结束日期,或者在给定的时间段内开始或者在同一给定的时间段内结束。任何帮助或方向如何可能完成将非常感激。我在下面的查询中包含WHERE部分和参数绑定,但如果需要的话可以包含更多的参数。在SQL中嵌套和/或者哪里

$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 
      ) 
     )  
+0

你到底想要做什么?为什么1900年结束日期? P.S:不需要使用像Start2和End2这样的不同变量,只需在每次需要时使用原始变量即可。 –

+1

看起来就像是从这里的1或2或3或4(除了分隔和子句之外,没有额外的括号)。什么不工作? – mcalex

+1

@Swift是的,你必须使用不同的占位符名称。事实上,你认为你不告诉我,你不[禁用模拟准备](http://stackoverflow.com/a/12202218/889949) - PDO模拟准备将允许你做到这一点,真正的准备做不。 – DaveRandom

回答

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 
    ) 

这假定变量有有效日期。

+0

我正在寻找在财政年度(开始 - 结束)内发生的任何头寸期间的信息。我需要知道风险投资期是从FY开始,在FY期间结束还是在上个财年开始,但是还没有结束。看起来你的逻辑比我的好。非常感谢您发布您的解决方案。 – Noel