Reserva de Quarto
31/12/2009
Boa Tarde a Todos,
Estou fazendo essa consulta SQL para verificar se o quarto está reservado para a Data:
Select ID, NUMERO, DESCRICAO from QUARTOS QUA
WHERE NOT EXISTS
(SELECT 1 FROM RESERVAS WHERE (RESERVAS.ID_QUARTO=QUA.ID) AND ((DATA_ENTRADA between :qdataEntrada AND :qdataSaida) OR (DATA_SAIDA between :qdataEntrada AND :qdataSaida)))
Exemplo:
O Quarto 01 está reservado para o dia 01/01/2010 até o dia 05/01/2010
Se eu tentar reservar para o dia 31/12/2009 até o dia 04/01/2010 ele bloqueia: Certinho.
02/01/2010 até o dia 06/01/2010: ele bloqueia tb Certinho.
Agora se eu tentar: 02/01/2010 até o dia 04/01/2010 ele está passando...
Alguma coisa errada nessa minha consulta..
Alguem poderia me ajudar,
Aguardo.
Posts
31/12/2009
Perivaldo Martins
Estou fazendo essa consulta SQL para verificar se o quarto está reservado para a Data: Select ID, NUMERO, DESCRICAO from QUARTOS QUA WHERE NOT EXISTS (SELECT 1 FROM RESERVAS WHERE (RESERVAS.ID_QUARTO=QUA.ID) AND ((DATA_ENTRADA between :qdataEntrada AND :qdataSaida) OR (DATA_SAIDA between :qdataEntrada AND :qdataSaida))) Exemplo: O Quarto 01 está reservado para o dia 01/01/2010 até o dia 05/01/2010 Se eu tentar reservar para o dia 31/12/2009 até o dia 04/01/2010 ele bloqueia: Certinho. 02/01/2010 até o dia 06/01/2010: ele bloqueia tb Certinho. Agora se eu tentar: 02/01/2010 até o dia 04/01/2010 ele está passando... Alguma coisa errada nessa minha consulta.. Alguem poderia me ajudar, Aguardo.
Primeiro: Creio eu q esse seu código seja do IB/FB.
Segundo: Talvez eu não tenha entendido o seu código.
Vejamos:
ENTRADA SAIDA
01/01/2010 05/01/2010
As datas informadas:
31/12/2009 - 04/01/2010 bloqueio
02/01/2010 - 06/01/2010 bloqueio
02/01/2010 - 04/01/2010 passa...
Select ID, NUMERO, DESCRICAO from QUARTOS QUA WHERE NOT EXISTS (SELECT 1 FROM RESERVAS WHERE (RESERVAS.ID_QUARTO=QUA.ID) AND ((DATA_ENTRADA between :qdataEntrada AND :qdataSaida) OR (DATA_SAIDA between :qdataEntrada AND :qdataSaida)))
Em entrada = 31/12/2009 saída = 04/01/2010, a condição é satisfeita, entre 31/12/2009 e 04/01/2010 ele vai encontrar pelo menos um registro em que a entrada e a saída estejam nesse intervalo.
Em entrada = 02/01/2010 saída = 06/01/2010, a condição é satisfeita, entre 02/01/2010 e 06/01/2010 ele vai encontrar pelo menos um registro em que a saída esteja nesse intervalo.
Em entrada = 02/01/2010 saída = 04/01/2010, a condição não é satisfeita, entre 02/01/2010 e 04/01/2010 ele não vai encontrar registros em que a entrada e ou a saída estejam nesse intervalo. Porque a entrada é dia: 01/01/2010 q é por tanto menos do que 02/01/2010 ou 03/01/2010 ou 04/01/2010. O mesmo acontece com a saída, perceba que ela está marcada para 05/01/2010, e vc informa: 04/01/2010, então a data está fora do intervalo.
Caso eu não tenha entendido, perdoe-me, tentarei ver com mais calma posteriormente e então tentar ajudá-lo.
Boa sorte e bons códigos.
Feliz Ano novo a todos os membros do fórum antigo, onde fiz várias amizades ao longo dos anos e aos deste fórum e participantes do portal Devmedia. A todos FELIZ ANO NOVO!!! Que 2010 seja um ano de realizações.
01/01/2010
Edson Dionisio
Boa tarde Perivado Martins,
Eu estava analisando o seu código e percebi que a consulta que está sendo feita pega os valores extremos da pesquisa e não faz a pesquisa interna. Acredito que isto se deva ao uso do NOT, pois aí vc está pegando oq não foi enquadrado. tenta sem o NOT.
P.S: não fiz o código por estar sem tempo, mas acredito que isso ajude!
Cópa do código posto sem o NOT:
Select ID, NUMERO, DESCRICAO from QUARTOS QUA WHERE EXISTS (SELECT 1 FROM RESERVAS WHERE (RESERVAS.ID_QUARTO=QUA.ID) AND ((DATA_ENTRADA between :qdataEntrada AND :qdataSaida) OR (DATA_SAIDA between :qdataEntrada AND :qdataSaida)))
Nesse caso, vc estaria fazendo uma pesquisa das reservas que existem.
01/01/2010
Perivaldo Martins
Olá colega EDSON JOSÉ DIONISIO, o código não é meu, é do colega C.S.S.R EDITORA SANTUÁRIO, eu apenas tentei ajudar, mostrando para ele q do jeito q ele escreveu o suposto erro vai acontecer, sem a palavra NOT ele terá um resultado diferente do q está tendo, e possivelmente seja disso que ele precise, não testei o código dele pq estou sem meu PC, mas mesmo assim, valeu por vir aqui ajudar.
Boa sorte e bons códigos!
Feliz Ano Novo!!