Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Verificando conflitos de intervalo de datas no MySQL


O problema que você está tendo é que sua consulta não é suficientemente robusta. Quando você decompõe o problema, o que você tem é o seguinte:

Se o intervalo definido por $check_in e $check_out sobrepõe o intervalo definido por checkin e checkout em qualquer maneira, então o quarto está reservado. Caso contrário, é gratuito.

Isso significa que:
  • Se $check_in>=checkin e $check_in <=checkout , o quarto está reservado
  • OU Se $check_out>=checkin e $check_out <=checkout , o quarto está reservado
  • OU Se $check_in <=checkin e $check_out>=checkout , o quarto está reservado

Portanto, você precisa representar esses dois cenários em sua subconsulta para obter as informações que está procurando.

Além disso, esperamos que você esteja usando datetime para suas comparações e não apenas time , caso contrário, você terá efeitos colaterais.

EDITAR:consulta SQL

(Lembre-se de que há mais de uma maneira de esfolar um gato, por assim dizer. Estou apenas fornecendo um exemplo que mantém o que você já tem o máximo possível. Mais uma vez, também estou assumindo que checkin , checkout , $check_in e $check_out todos serão resolvidos para datetime tipos)
SELECT *
FROM room
WHERE room_id NOT IN
(SELECT room_id 
 FROM bookings
 WHERE
   (checkin <= '$check_in' AND checkout >= '$check_in') OR
   (checkin <= '$check_out' AND checkout >= '$check_out') OR
   (checkin >= '$check_in' AND checkout <= '$check_out'))