Filtro entre 2 campos data

4 respostas
M

Banco de dados MySQL
Sei que para pesquisar em um campo data posso usar o seguinte código:

ou

Mas quando tenho 2 campos data com os nomes datainicial e datafinal como eu filtraria pelo intervalo dessas 2 datas?
Ex: Cadastro preço de quartos em um intervalo de datas por temporada.
Tabela datasdatemporada com os campos:iddatasdatemporada,dtinicial,dtfinal,temporadas_idtemporada
tenho os seguintes registros cadastrados:
1, ‘2012-04-15’, ‘2012-04-30’, 2
2, ‘2012-05-01’, ‘2012-06-30’, 2
3, ‘2012-07-01’, ‘2012-07-31’, 1
4, ‘2012-08-01’, ‘2012-11-30’, 2
5, ‘2012-12-01’, ‘2012-12-31’, 1

Eu quero filtrar pela data inicial e final.
Eu digito a data de chegada(aqui no formato do BD já): 2012-06-11 e
data de saída:2012-06-16

Na lógica teria que me retornar o intervalo
2, ‘2012-05-01’, ‘2012-06-30’, 2
mas não retorna nada. Perceba que o intervalo está entre
2012-05-01 até 2012-06-30

Como ficaria o código SQL correto para esse caso, sendo o nome da tabela
datasdatemporada?

4 Respostas

R

O select fez a lógica correta, pois
2012-05-01 < 2012-06-11
(1 de maio é menor que 11 de junho)

Portanto não deveria aparecer resultado nenhum mesmo.

M

Mas isso aqui 2012-05-01 até 2012-06-30
Tinha que aparecer sim esse registro acima. O problema é que como são 2 campos diferentes, ele não retorna nenhum registro. Se fosse filtrado por um só campo ele retornaria. Seria assim: nesse mês 05 até o mês 06 do dia 30 tem temporada cadastrada e portanto deveria aparecer isso na lógica sem o BD. Talvez eu tenha então que ter apenas um campo com as datas da temporada e adicionar de 1 por um as datas. Por ex: Eu seleciono de 2012-05-01 a 2012-05-15 e ele adicionaria no bd várias data até chegar no 15. 2012-05-01|2012-05-02| até o 2012-05-15. Assim quando eu filtrar entre datas ele me retornaria as datas no intervalo correto que eu queria, mas não da maneira que eu queria.

M

Em outro fórum consegui resolver esse problema. A resposta foi essa:

select * from datasdatemporada where '2012-06-11' between dtinicial and dtfinal and '2012-06-16' between dtinicial and dtfinal;

F

Tive o mesmo problema, entretanto todas as linhas que possuem o intervalo devem retornar de acordo com o filtro.

select * from teste
where ( ( data_ini between '2015-06-01' and '2015-07-20' ) or ( data_fin between '2015-06-01' and '2015-07-20' ) ) or
      ( ( '2015-06-01' between data_ini and data_fin ) or ( '2015-07-20' between data_ini and data_fin ) )
Criado 4 de abril de 2012
Ultima resposta 14 de jul. de 2015
Respostas 4
Participantes 3