2012-10-15 41 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