0

いくつかの条件を使用して、開始日と終了日に基づいてレコードを選択しようとしています。基本的に、終了日がないもの、または特定の期間に開始するか、同じ特定の期間に終了するものが必要です。これがどのように達成されるかについての助けや指示は非常に高く評価されます. 以下のクエリの 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
            )
        )       
4

1 に答える 1

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
      )

これは、変数に有効な日付があることを前提としています。

于 2012-10-15T13:46:24.133 に答える