In PostgreSQL, puoi usare OVERLAPS
operatore per verificare la sovrapposizione di periodi di tempo.
La funzione restituisce true quando due periodi di tempo (definiti dai relativi punti finali) si sovrappongono e false quando non si sovrappongono.
Sintassi
Può essere utilizzato nei seguenti due modi:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
In altre parole, fornisci una data/ora di inizio, quindi hai la possibilità di fornire una data/ora di fine o un periodo di tempo.
In particolare, gli endpoint possono essere specificati come coppie di date, orari o timestamp; o come data, ora o timestamp seguiti da un intervallo.
Quando viene fornita una coppia di valori, è possibile scrivere prima l'inizio o la fine; OVERLAPS
prende automaticamente come inizio il valore precedente della coppia.
Esempio
Ecco un esempio di base da dimostrare.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Risultato:
True
Il risultato è vero perché entrambi i periodi di tempo si sovrappongono.
Eccolo di nuovo, ma questa volta cambio i periodi di tempo in modo che non si sovrappongano.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
(date '2022-02-09', date '2022-03-08');
Risultato:
False
Endpoint comuni
È importante notare che ogni periodo di tempo è considerato rappresentare l'intervallo semiaperto start
<=
time
<
end
, a meno che start
e end
sono uguali nel qual caso rappresenta quel singolo istante di tempo. Ciò significa che due periodi di tempo con solo un endpoint in comune non si sovrappongono.
Nell'esempio successivo, il secondo periodo di tempo inizia lo stesso giorno in cui termina il primo periodo di tempo.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-10', date '2022-03-10');
Risultato:
False
Tuttavia, otteniamo un risultato diverso se entrambi i punti finali del primo periodo di tempo sono gli stessi:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
(date '2022-01-09', date '2022-02-10');
Risultato:
True
Intervalli
Come accennato, il secondo punto finale può essere un intervallo.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Risultato:
True