GUJ Discussões   :   últimos tópicos   |   categorias   |   GUJ Respostas

Query com jpql

É 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

É 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

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

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

tive que fazer duas query, uma < e outra >

vou tentar essa segunda maneira, muito obrigado amigo.

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

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.

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
//