I PostgreSQL kan du använda OVERLAPS
operatör för att testa för överlappande tidsperioder.
Funktionen returnerar sant när två tidsperioder (definierade av deras slutpunkter) överlappar varandra, och falskt när de inte överlappar varandra.
Syntax
Den kan användas på följande två sätt:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
Med andra ord, du anger ett startdatum/tid, sedan har du möjlighet att ange antingen ett slutdatum/tid eller en tidslängd.
Mer specifikt kan slutpunkterna anges som par av datum, tider eller tidsstämplar; eller som datum, tid eller tidsstämpel följt av ett intervall.
När ett par värden tillhandahålls kan antingen början eller slutet skrivas först; OVERLAPS
tar automatiskt det tidigare värdet av paret som start.
Exempel
Här är ett grundläggande exempel att visa.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Resultat:
True
Resultatet är sant eftersom båda tidsperioderna överlappar varandra.
Här är den igen, men den här gången ändrar jag tidsperioderna så att de inte överlappar varandra.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
(date '2022-02-09', date '2022-03-08');
Resultat:
False
Vanliga slutpunkter
Det är viktigt att notera att varje tidsperiod anses representera halvöppet intervall start
<=
time
<
end
, om inte start
och end
är lika i vilket fall det representerar det enstaka tidsögonblicket. Detta innebär att två tidsperioder med endast en gemensam slutpunkt inte överlappar varandra.
I nästa exempel börjar den andra tidsperioden samma dag som den första tidsperioden slutar.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-10', date '2022-03-10');
Resultat:
False
Vi får dock ett annat resultat om båda slutpunkterna för den första tidsperioden är desamma:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
(date '2022-01-09', date '2022-02-10');
Resultat:
True
Intervaller
Som nämnts kan den andra slutpunkten vara ett intervall.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Resultat:
True