ホームページ >データベース >mysql チュートリアル >SQL で重複する日付範囲を効率的に特定するにはどうすればよいでしょうか?

SQL で重複する日付範囲を効率的に特定するにはどうすればよいでしょうか?

Barbara Streisand
Barbara Streisandオリジナル
2025-01-18 08:13:08498ブラウズ

How Can We Efficiently Identify Overlapping Date Ranges in SQL?

SQL の日付範囲の比較

データベースに保存されている日付範囲を操作する場合、特定の日付範囲が既存の範囲と重複するかどうかを判断する必要がある場合があります。これは SQL データベースで繰り返し発生する問題です。

この問題を解決する 1 つの方法は、比較ロジックを反転することです。特定の範囲と重複する範囲を検索するのではなく、重複しない範囲を検索します。重複しない期間を特定することで、残りの期間が重複する期間であると結論付けることができます。

このロジックを説明するために、次の例を見てみましょう:

<code>           |-------------------|          与之比较
               |---------|                包含在内
           |----------|                   包含在内,起始时间相同
                   |-----------|          包含在内,结束时间相同
           |-------------------|          包含在内,起始和结束时间相同
     |------------|                       未完全包含,起始时间重叠
                   |---------------|      未完全包含,结束时间重叠
     |-------------------------|          起始时间重叠,范围更大
           |-----------------------|      结束时间重叠,范围更大
     |------------------------------|     完全重叠</code>

図からわかるように、比較期間と重複しない期間は、比較期間の終了後に開始するか、比較期間の開始前に終了します。

対照的に、比較期間と重複する期間は次のカテゴリに分類されます:

  • 比較期間内に含まれます
  • 比較期間内に含まれ、開始時刻または終了時刻が同じ
  • 比較期間の開始時刻または終了時刻と重複します
  • 完全に重複する比較期間

このロジックを SQL に変換すると、次のクエリを使用して、指定されたチェック エポックと重複するすべてのエポックを取得できます。

<code class="language-sql">SELECT *
FROM periods
WHERE range_start < @check_period_end AND range_end > @check_period_start;</code>

ロジックを逆にして、重複しないエポックを見つけることで、これらのエポックを効果的に特定して結果から除外し、一致するエポックのリストを残すことができます。

以上がSQL で重複する日付範囲を効率的に特定するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。