2017-09-11 74 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使用Inner Join編輯答案。 –

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 

而且查詢使用@start = '2017-09-11'@end = '2017-09-13'

以下客房將是有效的(假設5個室,如上所示):1, 4