PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

So testen Sie auf sich überschneidende Daten in PostgreSQL

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