2017-03-16 7 views
-2

私はホテル予約システムのウェブサイトを作っています。私はその質問について助けが必要です、私はポストを介して検索していましたが、私にとってはうまくいく解決策が見つかりませんでした。 私のDBにはテーブルの予約があります。チェックインとチェックアウトの日付は、ユーザーの入力がチェックインされ、指定された部屋をチェックアウトするときに照会する必要があります。ここに私のクエリは次のとおりです。ホテル予約システムへの問い合わせphp

SELECT * FROM booking WHERE room='$room' and ((checkin>='$cIN' and checkout<='$cOUT')or(checkin<='$cIN' and checkout>='$cOUT'))

「$ CIN」と「$ COUTは」のチェックのために、ユーザからの入力で、チェックしてください。 場合によっては自分のクエリが機能します。たとえば、部屋が15/03/2017から20/03/2017に予約されているとします。新しいユーザ入力が2013年3月13日から17/03/2017に変更された場合、クエリは戻りません。任意の結果、およびユーザーは同じ部屋を予約することができます。この場合、同じ時間間隔で1人の部屋に2人のユーザーがいます。私はこの種の予約を制限する必要があります。前もって感謝します。

+1

のあなたは一の周期が完全に他のまたはその逆に重なっているかどうかをチェックされている>、<を使用するには、このロジックを変更する必要があります - もちろん、ユーザーが入力した日付のうち1つのみがすでに予約された期間に該当する場合も考慮する必要があります。あなたが正しいロジックを見つけ出すことに問題があるなら、私はそれを理解するのに役立つはずの紙のケースを書くことをお勧めします。 – CBroe

+0

同じ日に2つの予約ができない場合(最初のゲストは今日まで予約されていますので、次のゲストは明日からしか予約できません)、開始日または終了日のいずれかが既存の期間に該当するかどうかを確認するだけです(最初/最後の日に平等を含む) – CBroe

+0

あなたの答えをありがとう、私は解決策を見つけたと思う、あなたのコメントは私を助けた:) – marjov

答えて

0

オーバーラップを見つけるには、要求されたチェックインが既存のチェックアウトの前にあり、要求されたチェックアウトが既存のチェックインの後にあるアイテムを検索する必要があります。

-- Return existing bookings that overlap the requested date range 
SELECT * 
FROM booking 
WHERE room = '$room' 
and checkin <= '$cOUT' and checkout >= '$cIN' 

このクエリは、前の予約がチェックアウトし、同時にチェックインに新しい予約を許可しないことに注意してください

:)を考えていたよりもシンプル。あなたのチェックイン/アウトフィールドは何の店の時間もしないなら、あなたは代わりに< =、> =

関連する問題