I PostgreSQL kan du bruge OVERLAPS
operatør til at teste for overlappende tidsperioder.
Funktionen returnerer sand, når to tidsperioder (defineret af deres endepunkter) overlapper hinanden, og falsk, når de ikke overlapper hinanden.
Syntaks
Det kan bruges på følgende to måder:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
Med andre ord, du angiver en startdato/tid, så har du mulighed for at angive enten en slutdato/tid eller et tidsrum.
Mere specifikt kan endepunkterne angives som par af datoer, tidspunkter eller tidsstempler; eller som en dato, et klokkeslæt eller et tidsstempel efterfulgt af et interval.
Når et par værdier er angivet, kan enten starten eller slutningen skrives først; OVERLAPS
tager automatisk den tidligere værdi af parret som start.
Eksempel
Her er et grundlæggende eksempel at demonstrere.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Resultat:
True
Resultatet er sandt, fordi begge tidsperioder overlapper hinanden.
Her er det igen, men denne gang ændrer jeg tidsperioderne, så de ikke overlapper hinanden.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
(date '2022-02-09', date '2022-03-08');
Resultat:
False
Fælles slutpunkter
Det er vigtigt at bemærke, at hver tidsperiode anses for at repræsentere det halvåbne interval start
<=
time
<
end
, medmindre start
og end
er ens, i hvilket tilfælde det repræsenterer det enkelte tidsøjeblik. Det betyder, at to tidsperioder med kun et endepunkt til fælles ikke overlapper hinanden.
I det næste eksempel starter den anden tidsperiode samme dag, som den første tidsperiode slutter.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-10', date '2022-03-10');
Resultat:
False
Vi får dog et andet resultat, hvis begge slutpunkter i den første tidsperiode er ens:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
(date '2022-01-09', date '2022-02-10');
Resultat:
True
Intervaller
Som nævnt kan det andet slutpunkt være et interval.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Resultat:
True