sql >> データベース >  >> RDS >> Mysql

MySQLでの日付範囲の競合のチェック

    あなたが抱えている問題は、クエリが十分に堅牢ではないということです。問題を分解すると、次のようになります。

    $check_inで定義された範囲の場合 および$check_out checkinで定義された範囲と重複しています およびcheckout 任意 ちなみに、部屋は予約されています。それ以外の場合は無料です。

    これは次のことを意味します:

    • $check_inの場合>=checkin および$check_in <=checkout 、部屋は予約済み
    • または $check_outの場合>=checkin および$check_out <=checkout 、部屋は予約済み
    • または $check_inの場合 <=checkin および$check_out>=checkout 、部屋は予約済み

    したがって、探している情報を取得するには、サブクエリでこれらのシナリオの両方を表す必要があります。

    また、datetimeを使用することをお勧めします timeだけでなく、比較のために そうしないと、副作用が発生します。

    編集:SQLクエリ

    (いわば、猫の皮を剥ぐ方法は複数あることに注意してください。私は、あなたがすでに持っているものを可能な限り維持する例を提供しているだけです。繰り返しになりますが、checkincheckout$check_in 、および$check_out すべてdatetimeに解決されます タイプ)

    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. SQLServerのメッセージ8116「引数データ型varcharがsession_context関数の引数1に対して無効です」を修正しました

    2. OSXにmysqlgemをインストールできません

    3. 動的に作成された入力フィールドからテーブルにデータを更新します

    4. Oracle SQL Developerでデータベース名を照会する方法は?