Usamos cookies para medir audiência e melhorar sua experiência. Você pode aceitar ou recusar a qualquer momento. Veja sobre o iMasters.
Bom dia,
Já fiquei dois dias em cima do problema com pesquisa e tentativas, porém não tem jeito de resolver.
Objetivo: retornar acomodações disponíveis no intervalo entre as datas incluíndo os dias nos extremos.
Campos na Tabela: data_inicio, data_fim - Tipo dos campos Date
Valores na Tabela: data_inicio (09/05/2016) - data_fim (11/05/2016)
Situação: cliente seleciona datas 09/05 e 10/05, deve retornar resultado já que esta entre o intervalo.
PHP:
list($dia, $mes, $ano) = explode('/', $entrada);
$chegada = ($ano.'-'.$mes.'-'.$dia);
list($dia, $mes, $ano) = explode('/', $saida);
$saida = ($ano.'-'.$mes.'-'.$dia);
SQL utilizada: ("SELECT * FROM promocoes LEFT JOIN acomodacoes ON acomodacoes.acomodacoes_id = promocoes.acomodacao WHERE ( promocoes.data_inicio >= '$chegada' ) AND (promocoes.data_fim <= '$saida' )")
O que tenho conseguido de retorno é se forem selecionadas as datas limites 09 e 11, porém não se selecionado o dia 10 em uma delas. Tentei converter de string para date, sem sucesso. Mas acho que o problema é esse, só não sei como resolver.
Desde já agradeço.
Se não me engano tem a clausula BETWEEN não é mais fácil?
Olá ESerra, obrigado. Pois é, deu bug no cérebro e estava trocando os sinais de maior e menor.
Agora me deparo com outro problema: tenho datas entrada-saida como: 01/05 - 03/05 | 02/05 - 04/05 | 05/05 - 07/05
Se for selecionada a filtragem para datas com entrada em 01/05 e saída 08/05, não estão retornando os 3 registros acima, retorna nenhum.
rpmarques, tentei com a BETWEEN, ele retorna o intervalo das 3 datas, mas não responde corretamente quando seleciono, por exemplo: 03/05 a 04/05, retorna nenhum.
Deveria ser algo simples, mas não entendo como está tão complicado...
>
Olá ESerra, obrigado. Pois é, deu bug no cérebro e estava trocando os sinais de maior e menor.
Agora me deparo com outro problema: tenho datas entrada-saida como: 01/05 - 03/05 | 02/05 - 04/05 | 05/05 - 07/05
Se for selecionada a filtragem para datas com entrada em 01/05 e saída 08/05, não estão retornando os 3 registros acima, retorna nenhum.
E porque retornaria? Veja a sua query, você quer uma condição que x <= '' E y =>'', esta condição consulta linha a linha buscando que os dois casem.
Bem observado ESerra, com base nisso tentei a seguinte query:
mysql_query("SELECT * FROM promocoes LEFT JOIN acomodacoes ON acomodacoes.acomodacoes_id = promocoes.acomodacao WHERE ((promocoes.data_inicio <= '$entrada' OR promocoes.data_inicio BETWEEN '$entrada' AND '$saida') AND (promocoes.data_fim >= '$saida')")
Ainda assim sem sucesso.
Penso que pode ser o tipo da variável, pois é string sendo que o campo é date...
Amigo, só pra descargo de consciência, se tu pegares a query e executar direto no banco, o que retorna?
neste último post, se tu deixar somente o between, não te resolveria, pois dai traria todas as datas entre o intervalo, não é?
Se você quer o período entre, os operadores estão invertidos...
...WHERE promocoes.data_inicio <= '$chegada' AND promocoes.data_fim >= '$saida'