酒店客房预订声明

时间:2013-11-24 17:05:52

标签: sql database-design

基本上我正在为我的计算a-level课程制作一个基本的酒店预订系统,并且遇到了绊脚石(也没有帮助偏头痛!)

我正在检查某个房间是否可供用户预订(该应用程序全部由员工运行和使用),但试图让我了解如何操作。

目前我想我可以在当前的预订数据库中搜索我想要预订的房间号和日期,如果匹配回来意味着某个房间被预订了。这一切都很好,花花公子,但我如何告诉它日期的范围? (对不起,糟糕的问题)我正在思考sql语句的伪代码版本:

  

如果'检查数据库中已经预订的日期“之前   '检查新预订日期''已经查看预订日期   在数据库'之后'检查新预订的日期'然后房间是   已经预订了。

基本上如果它返回一条记录,那么我知道房间已被预订。但我只需要弄清楚如何使用SQL根据我的签入/签出日期来搜索记录。

但那会允许双重预订,这让我很生气:/任何想法?

2 个答案:

答案 0 :(得分:3)

一开始看起来似乎并不完全明显,但实际上你可以用两个条件简化测试全部或部分日期重叠

假设您有BOOKING表,其中包含现有预订和新的预订,其中包含入住日期@NEW_CHECK_IN并查看日期@NEW_CHECK_OUT。要查找与这些日期重叠的所有预订(假设终点是包含的),您只需要这种where子句:

--Select overlapping bookings
-- ...
WHERE BOOKING.CHECK_IN <= @NEW_CHECK_OUT
  AND BOOKING.CHECK_OUT >= @NEW_CHECK_IN
-- ...

我知道这看起来太简单了,但请尝试使用drf说明的情景(加上错过的三个,(1)新预订在现有预订之后,(2)新预订严格在现有预订和(3)新预订等于现有预订)。您将看到这一系列简单的条件涵盖了所有这些情况。

答案 1 :(得分:2)

建议的伪代码只考虑现有预订和新预订之间存在冲突的可能性。为了说明这一点,请考虑预订一个房间。

         |======================|
      Check-in date        Check out date

假设我们想要创建一个新的预订,并有4个潜在的新预订。

         |======================|       Existing booking

      |-----------------------------|   New booking (Scenario 1)
   |----------|                         New booking (Scenario 2)
                        |-------------| New booking (Scenario 3)
|---|                                   New booking (Scenario 4)

其中,只有情景4与现有预订不重叠;其他人与现有预订发生冲突。当您的伪代码解决方案1时,它不会检测方案2或3,因此将允许双重预订。

实际上,您的伪代码可能看起来像这样。

Let E = booking already on the database
    N = new booking,
    CID = check-in date,
    COD = check-out date

For a new booking N, N conflicts with an existing booking iff there exists a record E where:
  (CID of E is between CID of N and COD of N), or
  (COD of E is between CID of N and COD of N), or
  (CID of N < CID of E and COD of N > COD of E)

在SQL中,根据您的架构,查询可能类似于以下内容:

-- assume @new_cid is the new checkin date and @new_cod is the new checkout date
select count(*) from bookings
where
@new_cid between bookings.checkindate and bookings.checkoutdate or
@new_cod between bookings.checkindate and bookings.checkoutdate or
(@new_cid <= bookings.checkindate AND @new_cod > bookings.checkoutdate)