2011-04-10 99 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