OVERLAPS: Definition vs. Intuition

Die ANSI SQL Funktion OVERLAPS prüft, ob zwei Zeiträume einander überlappen. OVERLAPS betrachtet die beiden Zeiträume dabei als halboffene Intervalle: Der jeweilige Endzeitpunkt wird als nicht im Zeitraum liegend betrachtet.

Beispiele:

  1. (current_date – 1, current_date) OVERLAPS (current_date, current_date + 1)
  2. (current_date, current_date) OVERLAPS (current_date, current_date + 1)

Die meisten Menschen meinen zunächst, daß beide ANSI SQL Ausdrücke wahr wären. Tatsächlich evaluiert ANSI SQL 1. zu falsch und 2. zu wahr. Der Irrtum entsteht dadurch, daß unser intuitives Verständnis überlappender Zeiträume i.d.R. auf geschlossenen Intervallen basiert: Wir betrachten auch den Endzeitpunkt als zum Zeitraum gehörend.

Im Folgenden seien P und Q zwei Zeiträume und stehen a bzw. e für den Anfangs- bzw. Endzeitpunkt eines Zeitraumes. Es gelte a <= e.

Um in ANSI SQL zu prüfen, ob die zwei geschlossenen Intervalle [Pa, Pe] und [Qa, Qe] einander überlappen, werte man folgende Bedingung aus:

Pe >= Qa AND Qe >= Pa

Begründung:

Es gibt sieben grundsätzliche Möglichkeiten, wie zwei geschlossene Intervalle zueinander liegen können. Davon sind fünf überlappend (1. – 5.) und nur zwei überlappungsfrei (6. – 7.):

  1. P und Q sind gleich
  2. P liegt vollständig in Q
  3. Q liegt vollständig in P
  4. P beginnt vor Q und endet in Q
  5. Q beginnt von P und endet in P
  6. P beginnt und endet vor Q
  7. Q beginnt und endet vor P

Ein allgemeiner Test auf Überlappung wäre: (Fall 1. trifft zu) oder (Fall 2. trifft zu) … oder (Fall 5. trifft zu). Einfacher ist es, Überlappung als Gegenteil von „überlappungsfrei“ zu betrachten: Weder (Fall 6. trifft zu) noch (Fall 7. trifft zu).

In ANSI SQL lautet dieser Ausdruck NOT(Pe < Qa OR Qe < Pa). Dies läßt sich unter Anwendung der DeMorganschen Regeln umformen zu (Pe >= Qa AND Qe >= Pa).