Tenho uma tabela no PostgreSQL que descreve alguns eventos que possuem uma data inicial e uma data final:
CREATE TABLE my_table
(
event_id serial NOT NULL,
start_date timestamp without time zone NOT NULL,
end_date timestamp without time zone NOT NULL
)
Um único evento pode se sobrepor ao anterior e ao seguinte. Na tabela a seguir, os primeiros 3 dos 4 eventos formam um intervalo de tempo contíguo:
1 '2015-04-02 22:09:03' '2015-04-02 22:19:05'
2 '2015-04-02 22:17:38' '2015-04-02 22:27:38'
3 '2015-04-02 22:25:21' '2015-04-02 22:36:23'
4 '2015-04-02 22:45:23' '2015-04-02 22:55:23'
É possível escrever uma consulta que verifique se existe um intervalo de data contíguo entre duas datas especificadas?
Eu gostaria de ter algo como:
select ...
from my_table
where start_date > '2015-04-02' and end_date < '2015-04-06'
Primeiro, combinamos intervalos que se sobrepõem para encontrar todas as "ilhas" contíguas dos intervalos:
Depois disso, é fácil verificar se um determinado intervalo está completamente rodeado por uma das ilhas contíguas encontradas.
Teste no SQLfiddle
Esta consulta retorna todas as lacunas nos dados que se sobrepõem ao intervalo de tempo fornecido. Também cobre gaps iniciais , finais ou totais (cobrindo):
Se nada for retornado, a verificação é bem-sucedida:
Precisa apenas de uma única varredura na mesa base e uma única função de janela. Deve ser rápido .
Se você não estiver familiarizado com as funções da janela, leia este capítulo do manual .
Relacionado:
Sobre
OVERLAPS
:Lacunas de contagem de funções
Para uma resposta rápida à sua pergunta sem detalhes, a consulta pode ser simplificada. Além disso, a manipulação de parâmetros é mais conveniente em uma função:
Ligar:
Retorna o número de lacunas.
0
significa que seu alcance está coberto.