В PostgreSQL можете да използвате OVERLAPS
оператор за тестване за припокриващи се периоди от време.
Функцията връща true, когато два периода от време (дефинирани от техните крайни точки) се припокриват, и false, когато не се припокриват.
Синтаксис
Може да се използва по следните два начина:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)
С други думи, вие предоставяте начална дата/час, след което имате възможност да предоставите или крайна дата/час или период от време.
По-конкретно, крайните точки могат да бъдат посочени като двойки дати, часове или времеви печати; или като дата, час или времеви печат, последван от интервал.
Когато е предоставена двойка стойности, може да се запише първо началото или края; OVERLAPS
автоматично приема по-ранната стойност на двойката като начало.
Пример
Ето основен пример за демонстрация.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Резултат:
True
Резултатът е верен, защото и двата периода от време се припокриват.
Ето го отново, но този път променям периодите от време, така че да не се припокриват.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
(date '2022-02-09', date '2022-03-08');
Резултат:
False
Общи крайни точки
Важно е да се отбележи, че всеки период от време се счита за представляващ полуотворения интервал start
<=
time
<
end
, освен ако start
и end
са равни, в който случай представлява този единичен момент от време. Това означава, че два периода от време само с обща крайна точка не се припокриват.
В следващия пример вторият период от време започва в същия ден, когато приключва първият.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
(date '2022-02-10', date '2022-03-10');
Резултат:
False
Въпреки това получаваме различен резултат, ако и двете крайни точки от първия период от време са еднакви:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
(date '2022-01-09', date '2022-02-10');
Резултат:
True
Интервали
Както споменахме, втората крайна точка може да бъде интервал.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
(date '2022-02-09', date '2022-03-10');
Резултат:
True