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