Mysql
 sql >> Database >  >> RDS >> Mysql

Verifica dei conflitti di intervallo di date in MySQL

Il problema che stai riscontrando è che la tua query non è sufficientemente robusta. Quando risolvi il problema, quello che hai è questo:

Se l'intervallo definito da $check_in e $check_out si sovrappone all'intervallo definito da checkin e checkout in qualsiasi modo, quindi la stanza è prenotata. In caso contrario, è gratuito.

Ciò significa che:

  • Se $check_in>=checkin e $check_in <=checkout , la camera è PRENOTATA
  • O Se $check_out>=checkin e $check_out <=checkout , la camera è PRENOTATA
  • O Se $check_in <=checkin e $check_out>=checkout , la camera è PRENOTATA

Quindi, devi rappresentare entrambi questi scenari nella tua sottoquery per ottenere le informazioni che stai cercando.

Inoltre, si spera che utilizzerai datetime per i tuoi confronti e non solo time , altrimenti avrai effetti collaterali.

EDIT:query SQL

(Tieni presente che c'è più di un modo per scuoiare un gatto, per così dire. Sto solo fornendo un esempio che tiene il più possibile ciò che hai già. Ancora una volta, presumo anche che checkin , checkout , $check_in e $check_out si risolveranno tutti in datetime tipi)

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'))