2013-01-05 54 views
0

我需要能夠檢查用戶給出的日期範圍是否可用。我在我的數據庫中有一張名爲booked的表格,其中包含開始日期,結束日期以及該時段已預訂的房間數量。特定時間內的可用房間數量?

比方說我booked表看起來像這樣:

room_id | start  | end  | amount_of_rooms_booked 
1  | 2012-12-12 | 2012-12-15 | 2 
1  | 2012-12-13 | 2012-12-16 | 3 
1  | 2012-12-18 | 2012-12-19 | 1 

如果有8間客房總數可供room_id 1,和用戶要求這個房間2012-12-102012-12-20之間,是有可能做一個查詢檢查已預訂的每一天房間SUM是否不超過8

的另一種方式,我可以做到這將是單獨存儲的每一天,並有booked表像這個:

room_id | start  | amount_of_rooms_booked 
1  | 2012-12-12 | 2 
1  | 2012-12-13 | 5 
1  | 2012-12-14 | 5 
1  | 2012-12-15 | 3 
1  | 2012-12-18 | 1 

這樣會在數據庫中使用更多的空間,但可能會更容易。我該怎麼辦?如果第一個想法如何執行查詢?有沒有其他更好的方法來實現我想要做的事情?

+0

什麼'room_id'的含義是什麼? –

回答

0

要回答你原來的問題,你會怎麼做:

SELECT SUM(amount_of_rooms_booked) FROM booked 
WHERE (start BETWEEN '2012-12-10' AND '2012-12-20' OR 
     end BETWEEN '2012-12-10' AND '2012-12-20') 
AND room_id = 1 

我想你是如何保存它是好的,雖然我可能會存儲每間客房預訂單排,而不是用一排'amount_of_rooms_booked'列。然後,上面的查詢將是COUNT查詢而不是SUM。

+1

因爲如果在2012年1月1日,2012年12月14日,2012年12月16日,5日和2012年1月1日,2012年12月17日,2012年1行有一行, 12-18,4',那麼SUM將超過8,但第一行仍有3個房間可用,第二個房間有4個 –

0

對於第一個選項,您始終可以使用一個函數,就像this一樣。

然後你有這樣的查詢(我使用SQL Server)返回其在給定的日期小於8個預訂房間:

SELECT D.theDate, SUM(amount_of_rooms_booked) AS [amount_of_rooms_booked] 
FROM 
      booked 
INNER JOIN 
      dbo.ExplodeDates('20121210','20121220') D ON D.thedate BETWEEN booked.start AND booked.end 
WHERE 
      booked.room_id = @room 
GROUP BY 
      booked.room_id, D.thedate 
HAVING 
      SUM(amount_of_rooms_booked) < @bookingLimit 

然而,如果這種做法是最好的,我不知道。我寧願使用你的第二個選項,由於不太複雜的解釋,我永遠不知道我是否需要另一種查詢。

0

我建議每間房每一天預訂一排。

對於這種結構,每種可能的計算都比較容易。是的,你會在表格中獲得更多數據,但它不會像你想象的那樣影響你的數據庫。我的事件認爲大多數查詢會更快,因爲您將避免複雜的日期計算。

因此,這裏是我的第二個方法優點:

  • 它匹配用戶的思維模式(主要)
  • SQL更簡單!和更快的(大部分)
  • 更容易保持
  • 更容易保持清潔的數據(可能)
相關問題