【问题标题】:Hotel Room Booking Statement酒店订房声明
【发布时间】:2013-12-09 05:57:38
【问题描述】:

基本上我正在为我的计算 A-level 课程制作一个基本的酒店预订系统,但遇到了一个绊脚石(也无助于偏头痛!)

我正在检查房间是否可供用户预订(顺便说一下,该应用程序已全部运行并由工作人员使用),但我试图弄清楚如何去做。

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

如果“数据库中已有预订的入住日期”早于 '新预订的入住日期' AND '已经预订的退房日期 在数据库中'是在'新预订的入住日期'之后,那么房间是 已经预订了。

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

但这将允许双重预订,啊,这让我发疯了:/有什么想法吗?

【问题讨论】:

    标签: sql database-design


    【解决方案1】:

    一开始可能看起来不是很明显,但您实际上可以用两个条件来简化完整或部分日期重叠的测试

    假设您有一个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) 新预订等于现有预订)。您会看到这组简单的条件涵盖了所有这些场景。

    【讨论】:

      【解决方案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)
      

      【讨论】:

      • 我会试一试,但你已经准确地解释了我想要表达的意思!抱歉,我的尝试非常糟糕,所以感谢您的理解。再次感谢您!
      猜你喜欢
      • 1970-01-01
      • 2017-08-27
      • 2016-03-29
      • 1970-01-01
      • 2012-03-27
      • 2016-02-23
      • 2021-07-01
      • 2011-08-18
      • 1970-01-01
      相关资源
      最近更新 更多