W PostgreSQL możesz użyć OVERLAPS
operatora, aby przetestować nakładające się okresy czasu.
Funkcja zwraca prawdę, gdy dwa okresy czasu (zdefiniowane przez ich punkty końcowe) nakładają się na siebie, i fałsz, gdy się nie nakładają.
Składnia
Można go używać na dwa sposoby:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
Innymi słowy, podajesz datę/godzinę rozpoczęcia, a następnie masz możliwość podania daty/godziny zakończenia lub czasu.
Dokładniej, punkty końcowe można określić jako pary dat, godzin lub znaczników czasu; lub jako datę, godzinę lub znacznik czasu, po których następuje interwał.
Gdy podana jest para wartości, najpierw można zapisać początek lub koniec; OVERLAPS
automatycznie przyjmuje wcześniejszą wartość pary jako początek.
Przykład
Oto podstawowy przykład do zademonstrowania.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Wynik:
True
Wynik jest prawdziwy, ponieważ oba okresy nakładają się na siebie.
Oto znowu, ale tym razem zmieniam przedziały czasowe, aby się nie nakładały.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
(date '2022-02-09', date '2022-03-08');
Wynik:
False
Typowe punkty końcowe
Ważne jest, aby pamiętać, że każdy okres jest uważany za reprezentujący interwał półotwarty start
<=
time
<
end
, chyba że start
i end
są równe, w którym to przypadku reprezentuje tę pojedynczą chwilę czasu. Oznacza to, że dwa okresy czasu ze wspólnym punktem końcowym nie nakładają się.
W następnym przykładzie drugi okres rozpoczyna się tego samego dnia, w którym kończy się pierwszy okres.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-10', date '2022-03-10');
Wynik:
False
Jednak otrzymamy inny wynik, jeśli oba punkty końcowe pierwszego okresu są takie same:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
(date '2022-01-09', date '2022-02-10');
Wynik:
True
Interwały
Jak wspomniano, drugim punktem końcowym może być interwał.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Wynik:
True