Ir ao conteúdo

Posts recomendados

Postado

Boa tarde Pessoa,

 

Eu tenho duas tabelas uma chama QUARTO com detalhes do quarto. 

Outra chama RESERVAS que contem detalhes da reserva a data inicial e final da reserva e também faz referência ao id  da tabela QUARTO.

Estou tentando criar uma query que verifica a disponibilidade do quarto, passando duas datas a data inicial e data final da reserva que o cliente quer fazer, caso tenha reserva já nessa data quero que a query não me retorne esse quarto, caso tenha essa disponibilidade quero que ela me retorne os detalhes do guarto. 

Será que alguém poderia me dar uma força, já tentei de tudo, mas não consegui bolar uma lógica para esse tipo de situação. 

 

 

 

 

Postado

Boa noite Pedro, este é um exercício ou uma aplicação real? Mas de qualquer forma, você deveria mudar o modo de pensar esta consulta, não é o único modo, e talvez minha ideia nem seja a melhor, mas eu faria uma dupla busca, verificando qual quarto NÃO tem reserva na data que você informou. Algo do tipo:

Selecione o Quarto da tabela Quartos QUE não ESTA EM (Selecione o Quarto da tabela Reservas ONDE data_reserva esta entre a Data_inicia e Data_final)....

  • Curtir 1
Postado

@Denis Bopp  Na realidade é uma aplicação que estou fazendo, eu peguei como exemplo uma reserva de um quarto pois é melhor de explicar mas na realidade a aplicação que estou fazendo é para aluguel de ponto de outdoor. 

Depois de tantas tentativas a forma que consegui foi a seguinte: 

select a.*, b.id, b.ponto_id from pontos a 
left join reservas b on b.ponto_id = a.id
and('2020-03-01' >= b.dtfinal
OR '2020-03-10' >= b.dtinicial)  
where b.id is null

Assim funciona, mas apenas caso a reserva  que eu quero fazer seja menor que a a data final da minha reserva já existente na minha tabela. 

Dessa forma que você passou eu tentei mas não consegui. 

tentei usar NOT IN, NOT EXISTS mas não obtive sucesso.

Postado

@pedrohcosta123  Oi Pedro, tudo bem? Olha só, vamos começar selecionando os pontos que tem reserva no intervalo de datas que você quer:

SELECT r.ponto_id 
FROM reservas AS r 
WHERE r.dtInicial >= '2020-03-01' AND r.dataFinal <= '2020-03-10'

no teu código você colocou >= (maior ou igual) para as duas datas, vai dar conflito.

Usando o LEFT JOIN como você fez...

SELECT p.* 
FROM pontos AS p 
	LEFT JOIN reservas AS r ON p.ponto_id = r.ponto_id 
WHERE p.ponto_id NOT IN
(SELECT r.ponto_id 
	FROM reservas AS r 
	WHERE r.dtInicial >= '2020-03-01' AND r.dataFinal <= '2020-03-10')

Teste e avise!

 

 

 

Crie uma conta ou entre para comentar

Você precisa ser um usuário para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora

Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas comunidades sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×
×
  • Criar novo...

LANÇAMENTO!

eletronica2025-popup.jpg


CLIQUE AQUI E BAIXE AGORA MESMO!