SQLで期間の重複チェック

MySQL

キャンペーン追加時に、登録済みのキャンペーンと重複あるかチェックするためのクエリ。

sprintf('((campaign_case_from BETWEEN %s AND %s) OR (campaign_case_to BETWEEN %s AND %s) OR (campaign_case_from <= %s AND %s <= campaign_case_to)) '
    , $conn->quote($campaign_case_from)
    , $conn->quote($campaign_case_to)
    , $conn->quote($campaign_case_from)
    , $conn->quote($campaign_case_to)
    , $conn->quote($campaign_case_from)
    , $conn->quote($campaign_case_to))

解説:
いずれかの条件がtrueになれば、重複している。
条件1:登録済みキャンペーンの開始日が、これから登録するキャンペーン期間に包含されていないか?
条件2:登録済みキャンペーンの終了日が、これから登録するキャンペーン期間に包含されていないか?
条件3:登録済みキャンペーンの開始日と終了日の間に、これから登録するキャンペーン期間が包含されているか?

コメント

  1. Yuki Matsukura より:

    こっちの方がパフォーマンス良さそうだね。
    http://d.hatena.ne.jp/deeeki/20080802/termchecksql2