sql >> Databáze >  >> RDS >> Mysql

Kontrola konfliktů období v MySQL

Problém, který máte, je ten, že váš dotaz není dostatečně robustní. Když problém rozeberete, máte toto:

Pokud je rozsah definovaný $check_in a $check_out překrývá rozsah definovaný checkin a checkout v jakémkoli způsobem, pak je pokoj rezervován. Jinak je zdarma.

To znamená, že:

  • Pokud $check_in>=checkin a $check_in <=checkout , pokoj je REZERVOVÁN
  • NEBO Pokud $check_out>=checkin a $check_out <=checkout , pokoj je REZERVOVÁN
  • NEBO Pokud $check_in <=checkin a $check_out>=checkout , pokoj je REZERVOVÁN

Abyste tedy získali informace, které hledáte, musíte ve svém dílčím dotazu zastoupit oba tyto scénáře.

Také doufejme, že budete používat datetime pro vaše srovnání a nejen pro time , jinak budete mít vedlejší účinky.

UPRAVIT:SQL dotaz

(Mějte na paměti, že existuje více než jeden způsob, jak stáhnout kočku, abych tak řekl. Uvádím pouze příklad, který co nejvíce odpovídá tomu, co již máte. Znovu také předpokládám, že checkin , checkout , $check_in a $check_out se vše převede na datetime typy)

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. Jak zobrazit seznam souborů ve složce s SQL Server

  2. Jak vytvoříte náhodný řetězec, který je vhodný pro ID relace v PostgreSQL?

  3. SQL dotaz pro rozdělení dat sloupců do řádků

  4. Frustrace SQLite onUpgrade().