2017-09-11 4 views
1

例:予約フォームの作成

私はホテルを持っており、所定の時間に撮影されない部屋を見ることができるフォームを作成する必要があります。

シングルBookinsは、SQLデータベーステーブルに保存されます。

room  start   end 
1   2017-09-01 2017-09-10 
2   2017-09-12 2017-09-15 
1   2017-09-01 2017-09-10 

今私は、顧客がために2017年9月10日から2017年9月11日に部屋を得ることができ、すべての部屋を、必要とします例。

私のようなSQLクエリの構築を試みた:

SELECT * FROM rooms WHERE room_id NOT IN (
     SELECT room_id FROM bookings WHERE start <= #startTime# AND end >= #endTime# 
) 

をしかし、結果は信頼できるものではありません。私はこれを最初に尋ねる人ではないと思うが、Google博士と何の情報も見つけられない。

答えて

1

あなたの条件にデータを持っていないように思える:

DECLARE @Rooms TABLE (Room_Id INT, Room VARCHAR(50)); 
DECLARE @Bookings TABLE (Room_Id INT, StartDate DATE, EndDate DATE); 

/**/ 
INSERT INTO @Rooms VALUES 
(1,'Room1'), 
(2,'Room2'), 
(3,'Room3'); 

INSERT INTO @Bookings VALUES 
(1,   '2017-09-01', '2017-09-10'), 
(2,   '2017-09-12', '2017-09-15'), 
(1,   '2017-09-01', '2017-09-10'); 

SELECT * 
FROM @Rooms 
WHERE Room_Id NOT IN (SELECT Room_Id FROM @Bookings WHERE StartDate <= '2017-09-12' AND EndDate >= '2017-09-15'); 

結果:

+=========+=======+ 
| Room_Id | Room | 
+=========+=======+ 
|  1 | Room1 | 
+---------+-------+ 
|  3 | Room3 | 
+---------+-------+ 
0

これを試してみてください。削除済みSub Query

SELECT R.* 
FROM @Rooms R, @Bookings B 
WHERE R.room_id <> B.room_id 
AND B.StartDate <= '2017-09-12'AND B.EndDate >= '2017-09-15' 

--Using Inner Join 
SELECT R.* 
FROM @Rooms R 
INNER JOIN @Bookings B ON R.room_id <> B.room_id 
WHERE B.StartDate <= '2017-09-12'AND B.EndDate >= '2017-09-15' 
+0

古い方法 – Sami

+0

@Samiは内部結合を使って答えを編集しました。 –

1

私はあなたが非常に近いと信じています。あなたは現在、予約の開始があなたの開始時間に等しいかそれ以上で、予約の終了があなたの終了時間以上であるすべての部屋をつかんでいます。これは機能しますが、指定された予約時間中に開始する予約や、指定された予約時間中に終了する予約には適用されません。

これらのエントリをキャッチするには、引数に変数の順序を入れ替えるだけです。あなたは、あなたの終了時間の前に始まる予約と、あなたの開始時間の後に終わる予約をチェックしたいと思う。これは、あなたが探している期間と重複するすべての予約をカバーします。

DECLARE @start DATE = '2017-09-11', 
     @end DATE = '2017-09-13' 

SELECT * FROM rooms WHERE room_id NOT IN (
     SELECT room_id FROM bookings WHERE start <= @end AND end >= @start 
) 

場合は、例えば、次のような値が設定されています

room  start   end 
1   2017-09-01 2017-09-10 
2   2017-09-12 2017-09-15 
1   2017-09-01 2017-09-10 
3   2017-09-09 2017-09-12 
4   2017-09-14 2017-09-17 
5   2017-09-13 2017-09-17 

そして、あなたのクエリは、有効な(のように5つの部屋を想定してなり@start = '2017-09-11'

以下の客室@end = '2017-09-13'を使用しています上記に示すように):1, 4

関連する問題