2011-04-10 133 views
0

我創建了一個簡單的查詢,試圖找出哪些別墅會在特定天數範圍內免費(checkin_date和checkout_date)。TSQL查詢幫助加入函數

SELECT DISTINCT default_villa_type 
FROM villa, reservation 
WHERE villa.villa_type = reservation.default_villa_type 
and res_checkin_date not between '2011-12-21' and '2011-12-23' 
and res_checkout_date not between '2011-12-21' and '2011-12-23' 

我需要查詢中使用:

但是現在,我想想,我不認爲我下面的查詢將返回正確的結果

別墅表具有以下的列:

(villa_id, phone_ext, villa_type, no_of_rooms, no_of_beds, default_price_plan) 

有以下的列的預訂表:

(confirm_no, credit_card_no, res_checkin_date, res_checkout_date, default_villa_type, price_plan) 

我不相信這是正確使用這兩個表來確定哪些類型的別墅仍然可用日期下進入查詢,但我可能是錯誤的,我需要一個新的眼睛來看看它。

+0

如果預訂的簽入時間在指定範圍的開始日期之前,並且其簽出日期在範圍的結束日期之後,那麼會破壞您的代碼的情況。因此,如果別墅的預訂時間爲2011年12月20日至2011年12月24日,該別墅不是免費的,但您的代碼將免費返還。 – bitxwise 2011-04-10 08:51:33

+0

表'預訂'中不應該有'villa_id'字段嗎?你怎麼知道哪個別墅是保留的? – 2011-04-10 09:50:28

+0

這是仍然開放或您的問題已被回答? – bitxwise 2011-04-18 13:28:07

回答

2

您可以嘗試查找所有不是免費優先的別墅,因爲您沒有代表免費別墅的記錄,而只有代表不是免費別墅的記錄。

SELECT villa_id 
FROM villa 
WHERE villa_type NOT IN (
    SELECT default_villa_type 
    FROM reservation 
      --reservations starting within range 
    WHERE res_checkin_date > '2011-12-21' 
      AND res_checkin_date < '2011-12-23' 

      --reservations starting before range and ending after range 
      OR (
       res_checkin_date <= '2011-12-21' 
       AND res_checkout_date > '2011-12-21' 
      ) 

      --reservations ending within range 
      OR (
       res_checkout_date > '2011-12-21' 
       AND res_checkout_date < '2011-12-23' 
      ) 
) 

的另一種方式,每次的Mikael的評論,可以是:

SELECT villa_id 
FROM villa 
WHERE villa_type NOT IN (
    SELECT default_villa_type 
    FROM reservation 
    WHERE res_checkin_date < '2011-12-23' 
      AND res_checkout_date > '2011-12-21' 
) 

我也建議你使用變量,而不是靜態的字符串的日期。

+0

你可以簡化你的where子句。看看這個答案。 http://stackoverflow.com/questions/5002689/how-can-i-determine-in-sql-server-if-a-datetime-range-overlaps-another/5002738#5002738 – 2011-04-10 11:31:23

+0

謝謝,Mikael。這篇文章寫得很深,直到深夜,只是「蠻橫逼着」它。 – bitxwise 2011-04-10 17:05:45