sql >> Databasteknik >  >> RDS >> PostgreSQL

Hur man testar för överlappande datum i PostgreSQL

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

  1. Spelar ordningsföljden på tabellerna som hänvisas till i ON-klausulen i JOIN någon roll?

  2. Bättre tekniker för att trimma inledande nollor i SQL Server?

  3. Hur man övervakar databasinstansernas tillstånd

  4. SQL Server beroenden