Eu tenho uma tabela retornando o seguinte conjunto de resultados:
mydate | startstop
------------+----------
2018-02-07 | start
2018-02-14 | stop
2017-02-06 | start
2017-02-12 | stop
2016-02-05 | start
2016-02-12 | stop
Preciso saber se minha data atual está em um dos intervalos, por exemplo se eu consultar a tabela a partir da data atual '2017-02-07'
, preciso obter 'TRUE'
.
Eu sei que parece tão simples, mas não é ser simples!
O melhor que encontrei é este:
select true
where '2017-02-06'>=
(select mydate from mytable where starstop='start' order by id limit 1)
and '2017-02-06' <=
(select mydate from mytable where startstop='stop' order by id limit 1);
Funciona retornando TRUE
se a data estiver em um de cada intervalo, mas somente se a tabela não tiver intervalos no futuro, e como você pode ver minha tabela tem intervalos no futuro.
Nota: O sistema de gerenciamento de banco de dados é o PostgreSQL 9.1
Na verdade é muito simples. Comece a partir da data desejada e desça as datas até encontrar a primeira linha. Se for,
'start'
então você está dentro de um intervalo. Se for'stop'
, você não é:O complicado
WHERE
é lidar com os intervalos de datas inclusivos. Se inclusivo-exclusivo fosse usado, a condição seria mais simples.Uma maneira semelhante - talvez um pouco mais clara - seria:
Então parece que você precisa transformar isso em algo parecido com:
depois disso, você pode fazer uma consulta que se parece com
o que provavelmente exigirá algum tipo de cursor para analisar e combinar as datas de início e término para construir seu intervalo.