Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Mateus Aziani

Consulta de preço entre duas datas

Recommended Posts

Fala pessoal, tudo beleza?

 

To com uma baita dúvida pra fazer uma consulta no MySQL a partir de um formulário. Vou tentar explicar melhor:

 

Tenho um formulário para cotação de diária de hotél, com vários hotéis já cadastrados no bd e suas respectivas diárias (visto que o valor das diárias muda de acordo com o periodo do ano).

 

Os campos recebidos do formulário são:

 

$id_hotel    = $_POST['id_hotel']; //id do hotel buscado
$datainicial = $_POST['datainicial']; //data da entrada
$datafinal   = $_POST['datafinal']; //data da saída
$qtd_05	     = $_POST['qtd_05'];   //quantidade de crianças 0 a 5 anos
$qtd_12	     = $_POST['qtd_12'];  //quantidade de crianças 6 a 12 anos
$qtd_adulto  = $_POST['qtd_adulto']; //quantidade de adultos

 

Sei que devo fazer uma consulta no MySQL para buscar as diárias disponiveis entre as datas desejadas.

Até tentei fazer mas não funcionou, o código que havia tentado é o seguinte:

SELECT id_hotel, id_diaria, nome_diaria, precoadulto_diaria
FROM diarias_tb
WHERE datainicial_diaria >= '$datainicial'  AND datafinal_diaria <= 'datafinal'


Sendo que no banco de dados , 'dataincial_diaria' e 'datafinal_diaria' são onde são armazenados as datas de cada diária.


Será que deu pra entender? Se sim, qual a maneira correta de realizar a busca para que o valor da diaria apareca de acordo com a data buscada?


Obrigado!



Uma informação que talvez seja util acrescentar: Cada diária cadastrada tem a id do hotel, pra que seja possivel buscar as diarias do hotel.

Compartilhar este post


Link para o post
Compartilhar em outros sites


BETWEEN '$data_inicio' AND '$data_fim' 

Para selecionar o período entre as datas você vai usar o between para o hotel desejado acredito que like seja uma boa opção (você busca pela id do hotel correto?) e os outros parâmetros são apenas para calculo da diária em cima dos valores do resultado da pesquisa

 

não tinha visto que o Osmar tinha postado, é isso ai mesmo...

Compartilhar este post


Link para o post
Compartilhar em outros sites

Osmar e Willian: Obrigado! Funcionou aqui! É realmente simples né?

 

Uma outra dúvida agora que eu queria acertar: Vamos supor que até o dia 30/09 o valor é X, e a partir de 01/10 o valor passa a ser Y: É possivel adaptar o código para que ele exiba os dois valores separadamente?

 

Da maneira atual, se houver uma buscar entre 29/09/2013 e 04/10/2013 aparece apenas o valor de outubro.

Eu preciso do valor das duas diárias para somar depois (se vocês puderem me dar alguma dica quanto a isso também, eu agradeço!)


Obrigado!

Compartilhar este post


Link para o post
Compartilhar em outros sites

dei uma olhada melhor no código e tem uma coisinha

 


 


SELECT * 
FROM diarias_tb
WHERE id_hotel = '6'
AND datainicial_diaria
BETWEEN '2013-09-02'
AND '2013-10-10'

 

 

to testando assim direto do bd, se eu com essas datas ele consegue buscar o mês de outubro apenas, mas se eu coloco duas datas de um mesmo mês ele não me retorna nada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, vou adicionar algumas informações que creio que podem ser úteis.

Minha tabela está alimentada com alguns dados (coloquei os relevantes)

| id_hotel | nome_diaria | precoadulto_diaria | datainicial_diaria | datafinal_diaria |
+----------+-------------+--------------------+--------------------+------------------+
| 6        | Setembro    | 100.00             | 2013-09-01         | 2013-09-30
| 6        | Outubro     | 150.00             | 2013-10-01         | 2013-10-31
| 6        | Novembro    | 200.00             | 2013-11-01         | 2013-11-30
| 6        | Dezembro    | 400.00             | 2013-12-01         | 2014-01-04


Quando realizo a seguinte consulta:

SELECT * 
FROM diarias_tb 
WHERE id_hotel= '6'
AND datainicial_diaria >= '2013-09-26' 
AND datafinal_diaria <= '2013-09-28'  


Não me retorna nada. Pelos dados passados, não deveria me trazer as informações referente a o mês Setembro?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pelos dados que você passou não vai retornar nada mesmo. Você esta dizendo na query que quer o hotel 6 com datainicial_diaria maior ou igual a 26/09 e datafinal_diaria menor ou igual a 28/09, veja que no seu caso você tem o hotel 6 com datainicial_diaria do dia 01/09 (ou seja, menor do que 26/09) e datafinal_diaria do dia 30/09 (ou seja maior que 28/09).

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ué, imaginei que por a data que eu busquei estar entre as duas datas na tabela funcionaria. Mas entendi!


Qual seria a maneira ideal para criar isso?

Isso faz parte de um sistema de cotação de diárias para hotéis. São duas áreas, uma administrativa, para realizar o cadastro dos hotéis e suas diárias (os preços das diárias tem data especifica, dai o 'datainicial_diaria' e 'datafinal_diaria') E a áre a publica, onde há um formulário com select.

O cliente informa a data que deseja ficar no hotel, e o sistema buscara diárias dentro da data informada.

Não sei se deu pra entender bem, de qualquer forma obrigado pela resposta :)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Você já pensou em ter uma modelagem do tipo

id_hotel

data

valor

 

Assim o cara no momento do cadastro colocaria a data inicial e final e você geraria as datas intermediária, isso resolveria o seu problema e ainda de quebra o cliente poderia colocar valores diferentes nos "dias do meio"... foi a solução que eu encontrei quando precisei fazer um sistema de agendamento. Óbvio que cada caso é um caso, e o escopo do projeto define a modelagem que vai ser seguida.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Obrigado pelas respostas! Vamos lá.

ESerra, você poderia me explicar melhor sobre a modolagem por favor? ficou meio confuso pra mim rs

Evandro, dei uma lista no tópico que você me passou, porém daquela forma ele não me traz resultado nenhum.

 

E Lúdio, no momento eu estou testando as consultas diretos pelo MySQL!

Compartilhar este post


Link para o post
Compartilhar em outros sites

Para usar a modelagem que você idealizou você tem que usar:


SELECT * FROM diarias_tb WHERE id_hotel= '6' AND datainicial_diaria <= '2013-09-26' AND datafinal_diaria >= '2013-09-28'

Só note que usando os mesmos dados que você mostrou, não retornaria nenhum resultado se eu usasse por exemplo 2013-09-26 e 2013-10-05.

Compartilhar este post


Link para o post
Compartilhar em outros sites

ESerra, dessa maneira funcionou perfeitamente! Obrigado!
Mas como eu poderia fazer para que retornasse dois resultados se eu usasse por exemplo essas duas datas mesmo que você disse 2013-09-26 e 2013-10-05?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Ai em vez de AND você teria que usar OR entre as datas

 

SELECT * FROM diarias_tb WHERE id_hotel= '6' AND (datainicial_diaria <= '2013-09-26' OR datafinal_diaria >= '2013-09-28')

 

Observe que isso poderia te trazer inúmeras linhas... ai você teria que tratar isto tudo com o PHP.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Entendi! Realmente, fiz várias consultas com a última query que me passou e todas elas me trouxeram todos os registros.

Poxa, não imaginei que seria tão complicado assim e daria tanto trabalho pro pessoal do fórum. =[

Compartilhar este post


Link para o post
Compartilhar em outros sites

Pessoal, acho que encontrei por hora uma solução para o meu problema! \o/

 

Fuçando em um fórum de Portugal me deparei com essa query:

 

SELECT
	*
FROM
	diarias_tb
WHERE
	id_hotel='6'
	AND 
	-- Esta primeira parte apanha todas as actividades que tenham o fim ou o inicio no teu
	-- intervalo
	((datainicial_diaria between '2013-10-02' and '2014-01-04')
	OR (datafinal_diaria between '2013-10-02' and '2014-01-04')
	-- Esta segunda parte serve para apanhar as actividades que começam e acabam 
	-- fora do teu intervalo, mas que o intersectam
	OR ('2013-10-02' between datainicial_diaria and datafinal_diaria)
	OR ('2014-01-04' between datainicial_diaria and datafinal_diaria))

 

E funcionou como o esperado! Esta query consegue buscar tanto dentro de um mês quando em mais de um mês!

 

Agora estou aqui pensando como vou trabalhar com o PHP para separar as datas para realizar a soma caso aconteça de haver mais uma diária durante o período selecionado. Se alguém tiver alguma dica para me dar, agradeço mais ainda!

 

Obrigado a todos que me ajudaram aqui. Obrigado mesmo!


Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.