Query com jpql

8 respostas
programação
Tiozera

É o seguinte, eu tenho uma JPQL, que retorna um count para mim, caso seja acima de 0 eu sei que é true. O código:

SELECT count(*) > 0 
FROM reserva r
WHERE 
  r.locais = :codigo_locais 
  AND r.dataReserva = :data_reserva 
  AND hora_inicial BETWEEN r.horaInicial AND r.horaFinal 
  OR hora_final BETWEEN r.horaInicial AND r.horaFinal

problema É o seguinte, tenho uma query onde verifico o horário, caso o horário bata ele me retorna 1, mas ele até funciona fora do range.Exemplo: 8:00 às 12:00, caso eu queira salvar 7:30 às 15:00, ele bate no range, mas quando coloco 8:30 às 11:00, ele permite de boas.
alguém poderia me dar um help ? quero que ele não deixe nos dois casos banco é o postgresql

8 Respostas

pmlm

É um erro comum em quem junta AND com OR.

O que tu tens, na realidade, é como se fosse assim

select count (*) > 0 from reserva r 
where (r.locais =:codigo_locais and r.dataReserva =:data_reserva AND hora_inicial BETWEEN r.horaInicial AND r.horaFinal) 
   OR (hora_final BETWEEN r.horaInicial AND r.horaFinal)

E o que queres, presumo que seja algo assim

select count (*) > 0 from reserva r 
where r.locais =:codigo_locais and r.dataReserva =:data_reserva 
  AND ((hora_inicial BETWEEN r.horaInicial AND r.horaFinal) 
   OR (hora_final BETWEEN r.horaInicial AND r.horaFinal))

Ou, simplificando a lógica

select count (*) > 0 from reserva r 
where r.locais =:codigo_locais and r.dataReserva =:data_reserva 
  AND hora_inicial <= r.horaFinal
  AND hora_final => r.horaInicial
Tiozera

muito obrigado por uma direção amigo, estava pra ficar doido

Tiozera

No caso da ultima, ele vai passar, eu tentei dessa maneira

Tiozera

tive que fazer duas query, uma < e outra >

Tiozera

vou tentar essa segunda maneira, muito obrigado amigo.

Tiozera

exemplo que tinha feito

SELECT
    COUNT(*) > 0
FROM
    Reserva r
WHERE
    r.local = :reseva.local
AND
    r.data = :reserva.data
AND
    r.horaInicial >= :reseva.horaInicial
AND
    r.horaFinal <= :reseva.horaFinal
Tiozera

Agora ele não deixa salvar o dia todo, eu implementei esse segundo, basicamente se eu estiver um 8:00 às 12:00 ele não deixa salvar nem das 15:00 ás 18:00.

pmlm

Atenção aqui. Não é isto que eu tenho acima. Há troca nas comparações.

Queres procurar algo que comece antes da hora final e termine depois da hora inicial

AND r.horaInicial <= :reseva.horaFinal
AND r.horaFinal >= :reseva.horaInicial
Criado 23 de novembro de 2021
Ultima resposta 23 de nov. de 2021
Respostas 8
Participantes 2