PostgreSQL
 sql >> Base de Dados >  >> RDS >> PostgreSQL

Como testar datas sobrepostas no PostgreSQL


No PostgreSQL, você pode usar o OVERLAPS operador para testar períodos de tempo sobrepostos.

A função retorna true quando dois períodos de tempo (definidos por seus pontos de extremidade) se sobrepõem e false quando não se sobrepõem.

Sintaxe


Ele pode ser usado das duas maneiras a seguir:
(start1, end1) OVERLAPS (start2, end2)
(start1, length1) OVERLAPS (start2, length2)

Em outras palavras, você fornece uma data/hora de início e, em seguida, tem a opção de fornecer uma data/hora de término ou um período de tempo.

Mais especificamente, os terminais podem ser especificados como pares de datas, horas ou carimbos de hora; ou como uma data, hora ou carimbo de hora seguido por um intervalo.

Quando um par de valores é fornecido, o início ou o fim podem ser gravados primeiro; OVERLAPS automaticamente toma o valor anterior do par como o início.

Exemplo


Aqui está um exemplo básico para demonstrar.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
       (date '2022-02-09', date '2022-03-10');

Resultado:
True

O resultado é verdadeiro porque os dois períodos de tempo se sobrepõem.

Aqui está novamente, mas desta vez eu mudo os períodos de tempo para que eles não se sobreponham.
SELECT (date '2022-01-09', date '2022-02-08') OVERLAPS
       (date '2022-02-09', date '2022-03-08');

Resultado:
False

Pontos de extremidade comuns


É importante observar que cada período de tempo é considerado como representando o intervalo semiaberto start <= time < end , a menos que start e end são iguais, caso em que representa aquele único instante de tempo. Isso significa que dois períodos de tempo com apenas um ponto de extremidade em comum não se sobrepõem.

No próximo exemplo, o segundo período de tempo começa no mesmo dia em que o primeiro período de tempo termina.
SELECT (date '2022-01-09', date '2022-02-10') OVERLAPS
       (date '2022-02-10', date '2022-03-10');

Resultado:
False

No entanto, obtemos um resultado diferente se os dois pontos finais do primeiro período de tempo forem os mesmos:
SELECT (date '2022-01-09', date '2022-01-09') OVERLAPS
       (date '2022-01-09', date '2022-02-10');

Resultado:
True

Intervalos


Como mencionado, o segundo ponto final pode ser um intervalo.
SELECT (date '2022-01-09', interval '32 days') OVERLAPS
       (date '2022-02-09', date '2022-03-10');

Resultado:
True