In PostgreSQL können Sie die OVERLAPS
verwenden Operator zum Testen auf sich überschneidende Zeiträume.
Die Funktion gibt „true“ zurück, wenn sich zwei Zeiträume (definiert durch ihre Endpunkte) überschneiden, und „false“, wenn sie sich nicht überschneiden.
Syntax
Es kann auf zwei Arten verwendet werden:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
Mit anderen Worten, Sie geben ein Startdatum/eine Startzeit an und haben dann die Möglichkeit, entweder ein Enddatum/eine Endzeit oder eine Zeitspanne anzugeben.
Genauer gesagt können die Endpunkte als Paare von Daten, Zeiten oder Zeitstempeln angegeben werden; oder als Datum, Uhrzeit oder Zeitstempel gefolgt von einem Intervall.
Wenn ein Wertepaar angegeben wird, kann entweder der Anfang oder das Ende zuerst geschrieben werden; OVERLAPS
nimmt automatisch den früheren Wert des Paares als Start.
Beispiel
Hier ist ein einfaches Beispiel zur Veranschaulichung.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Ergebnis:
True
Das Ergebnis ist wahr, da sich beide Zeiträume überschneiden.
Hier ist es wieder, aber diesmal ändere ich die Zeiträume so, dass sie sich nicht überschneiden.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
(date '2022-02-09', date '2022-03-08');
Ergebnis:
False
Gemeinsame Endpunkte
Es ist wichtig zu beachten, dass jeder Zeitraum als das halboffene Intervall start
betrachtet wird <=
time
<
end
, es sei denn start
und end
gleich sind, in welchem Fall es diesen einzelnen Zeitpunkt darstellt. Das bedeutet, dass sich zwei Zeiträume mit nur einem gemeinsamen Endpunkt nicht überschneiden.
Im nächsten Beispiel beginnt der zweite Zeitraum am selben Tag, an dem der erste Zeitraum endet.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-10', date '2022-03-10');
Ergebnis:
False
Allerdings erhalten wir ein anderes Ergebnis, wenn beide Endpunkte des ersten Zeitraums gleich sind:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
(date '2022-01-09', date '2022-02-10');
Ergebnis:
True
Intervalle
Wie bereits erwähnt, kann der zweite Endpunkt ein Intervall sein.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Ergebnis:
True