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

Kontrollerer for datointervalkonflikter i MySQL

Det problem, du har, er, at din forespørgsel ikke er tilstrækkelig robust. Når du nedbryder problemet, er det, du har, dette:

Hvis området defineret af $check_in og $check_out overlapper området defineret af checkin og checkout i enhver måde, så er værelset booket. Ellers er det gratis.

Det betyder, at:

  • Hvis $check_in>=checkin og $check_in <=checkout , værelset er BOOKET
  • ELLER Hvis $check_out>=checkin og $check_out <=checkout , værelset er BOOKET
  • ELLER Hvis $check_in <=checkin og $check_out>=checkout , værelset er BOOKET

Så du skal repræsentere begge disse scenarier i din underforespørgsel for at få den information, du leder efter.

Du vil forhåbentlig også bruge datetime for dine sammenligninger og ikke kun time , ellers vil du få bivirkninger.

EDIT:SQL-forespørgsel

(Husk på, at der er mere end én måde at flå en kat på, så at sige. Jeg giver bare et eksempel, der så meget som muligt holder med det, du allerede har. Endnu en gang går jeg også ud fra, at checkin , checkout , $check_in , og $check_out vil alle løses til datetime typer)

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. Reversering af effekten af ​​`mysqli_real_escape_string`

  2. Sådan ÆNDRES flere kolonner på én gang i SQL Server

  3. mysql hierarkilager med store træer

  4. Skal jeg bruge CASCADE DELETE-reglen?