No MySQL, se eu tiver uma lista de intervalos de datas (início e fim do intervalo). por exemplo
10/06/1983 to 14/06/1983
15/07/1983 to 16/07/1983
18/07/1983 to 18/07/1983
E eu quero verificar se outro intervalo de datas contém QUALQUER um dos intervalos já na lista, como eu faria isso?
por exemplo
06/06/1983 to 18/06/1983 = IN LIST
10/06/1983 to 11/06/1983 = IN LIST
14/07/1983 to 14/07/1983 = NOT IN LIST
Respostas:
Este é um problema clássico e, na verdade, é mais fácil se você inverter a lógica.
Deixe-me lhe dar um exemplo.
Vou postar um período de tempo aqui e todas as diferentes variações de outros períodos que se sobrepõem de alguma forma.
por outro lado, deixe-me postar todos aqueles que não se sobrepõem:
Portanto, se você simplesmente reduzir a comparação para:
então você encontrará todos aqueles que não se sobrepõem e, em seguida, encontrará todos os períodos não correspondentes.
Para seu exemplo final NOT IN LIST, você pode ver que ele corresponde a essas duas regras.
Você precisará decidir se os seguintes períodos estão DENTRO ou FORA de seus intervalos:
Se sua tabela tem colunas chamadas range_end e range_start, aqui está um SQL simples para recuperar todas as linhas correspondentes:
Observe o NÃO aí. Visto que as duas regras simples encontram todas as linhas não correspondentes , um simples NÃO irá inverter para dizer: se não é uma das linhas não correspondentes, tem que ser uma das correspondentes .
Aplicando a lógica de reversão simples aqui para se livrar do NÃO e você acabará com:
fonte
Tomando o seu intervalo de exemplo de 06/06/1983 a 18/06/1983 e supondo que você tenha colunas chamadas início e fim para seus intervalos, você poderia usar uma cláusula como esta
ou seja, verifique se o início do seu intervalo de teste é antes do final do intervalo do banco de dados e se o final do seu intervalo de teste está após ou no início do intervalo do banco de dados.
fonte
Se o seu RDBMS suportar a função OVERLAP (), isso se torna trivial - não há necessidade de soluções caseiras. (No Oracle, aparentemente funciona, mas não é documentado).
fonte
Em seus resultados esperados, você diz
06/06/1983 a 18/06/1983 = NA LISTA
No entanto, este período não contém nem está contido por nenhum dos períodos em sua tabela (não lista!) De períodos. No entanto, ele se sobrepõe ao período de 10/06/1983 a 14/06/1983.
Você pode achar o livro Snodgrass ( http://www.cs.arizona.edu/people/rts/tdbbook.pdf ) útil: ele é anterior ao mysql, mas o conceito de tempo não mudou ;-)
fonte
Criei uma função para lidar com esse problema no MySQL. Basta converter as datas em segundos antes de usar.
fonte
Veja o seguinte exemplo. Será útil para você.
fonte
Experimente isto no MS SQL
fonte
fonte
Outro método usando a instrução BETWEEN sql
Períodos incluídos:
Períodos excluídos:
fonte
fonte