PostgreSQL
 sql >> база данни >  >> RDS >> PostgreSQL

Как да тествате за припокриващи се дати в PostgreSQL

В 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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Грешка:Колоната не съществува

  2. Премахване на дубликат от таблица

  3. Подобряване на функция, която UPSERTs въз основа на входен масив

  4. Сравняване на хранилища за данни за PostgreSQL - MVCC срещу InnoDB

  5. Как да наложа подобна на набор уникалност между множество колони?