sql >> Database >  >> RDS >> Mysql

Controleren op datumbereikconflicten in MySQL

Het probleem dat u ondervindt, is dat uw query niet robuust genoeg is. Als je het probleem oplost, heb je dit:

Als het bereik gedefinieerd door $check_in en $check_out overlapt het bereik gedefinieerd door checkin en checkout in elke manier, dan is de kamer geboekt. Anders is het gratis.

Dit betekent dat:

  • Als $check_in>=checkin en $check_in <=checkout , de kamer is GEBOEKT
  • OF Als $check_out>=checkin en $check_out <=checkout , de kamer is GEBOEKT
  • OF Als $check_in <=checkin en $check_out>=checkout , de kamer is GEBOEKT

U moet dus beide scenario's in uw subquery weergeven om de informatie te krijgen waarnaar u op zoek bent.

Hopelijk gebruikt u ook datetime voor uw vergelijkingen en niet alleen time , anders krijgt u bijwerkingen.

BEWERK:SQL-query

(Houd er rekening mee dat er meer dan één manier is om een ​​kat te villen, om zo te zeggen. Ik geef slechts een voorbeeld dat zoveel mogelijk aansluit bij wat je al hebt. Nogmaals, ik neem ook aan dat checkin , checkout , $check_in , en $check_out zullen allemaal oplossen naar datetime soorten)

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


  1. blob omzetten in clob

  2. Gegevens invoegen om op te nemen in sqlite

  3. Chen-notatie

  4. Hoe de seed-waarde handmatig in te stellen als 1000 in MySQL