【问题标题】:SQL query to search for room availability用于搜索房间可用性的 SQL 查询
【发布时间】:2015-03-23 14:44:39
【问题描述】:

我有以下表格:

 CUSTOMERS (CustomerID, firstname, surname etc)
 ROOMS (RoomID, RoomType, Description)
 BOOKING (BookingID, CustomerID, Arrival Date, Departure Date, number of people, total cost)
 ROOMS_BOOKED (BookingID, RoomID)

用户输入两个日期到达和离开。然后检查房间的可用性。目前有一个房间被我自己插入到数据库中。所以 BOOKING 表现在包括 BookingID = 1、CustomerID = 1、Arrival Date = 24/03/2015、Departure Date = 26/03/2015、人数 = 1、总成本 = 40.00。然后在 ROOMS_BOOKED 表中,我有 BookingID = 1 和 RoomID = 2,这是一个标准房间。

我正在使用这个 sql 代码 -

   SELECT RoomType FROM ROOMS WHERE RoomID NOT IN (SELECT RoomID FROM ROOMS_BOOKED) 

此查询返回尚未预订但不是我要查找的房间。例如,用户选择在数据库中预订的相同日期。因此,我希望能够在下一页显示所有房间类型,并为在这些选定日期预订的特定房间类型显示 x 或其他内容,类似于 www.galgorm.com。

我需要这方面的帮助,每次我发布关于此的问题时,我都没有得到答案或某种形式的帮助。到目前为止,我已经完成了这个酒店系统的设计,我现在希望能够完成它。

请帮助我,我敢肯定有时你也遇到过同样的情况需要帮助。

【问题讨论】:

  • 听起来你想要某种LEFT JOIN 以便它返回结果,但你也可以有条件地判断它们是否已被预订。
  • Sql for room availability的可能重复
  • 您不需要在查询中添加日期吗?
  • 如果我在数据库中查询房间可用性,我会坚持使用房间表和预订表吗?还是我需要查询 Rooms_booked 表?
  • 您使用的是哪个 DBMS?后格雷斯?甲骨文?

标签: sql sql-server


【解决方案1】:

您有以下情况

The user's selected period:
--------[---------]-------
Booking no1 
[-----]-------------------
Booking no2
--------------------[----]
Booking no3
-----[----]---------------
Booking no4
-----------[---]----------
Booking no5
------[-------]-----------
Booking no6
--------------[--------]--
Booking no7
-----[----------------]---

您将必须找出跨越了哪些时期。 显然案例 1 和 2 是免费的。 案例 3、5、6 很容易捕获,因为您可以搜索预订的开始日期或预订的结束日期是否在用户的选择范围内。 案例 4 和 7 您需要确定用户的选择日期是否在预订之间。

所以下面找到空闲房间:

DECLARE @ArrivalDate AS DATETIME
DECLARE @DepartureDate AS DATETIME

SELECT RoomType 
FROM ROOMS 
WHERE RoomID NOT IN 
(
    SELECT RoomID 
    FROM   BOOKING B
           JOIN ROOMS_BOOKED RB
               ON B.BookingID = RB.BookingID
    WHERE  (ArrivalDate <= @ArrivalDate AND DepartureDate >= @ArrivalDate) -- cases 3,5,7
           OR (ArrivalDate < @DepartureDate AND DepartureDate >= @DepartureDate ) --cases 6,6
           OR (@ArrivalDate <= ArrivalDate AND @DepartureDate >= ArrivalDate) --case 4
)

【讨论】:

  • 感谢您的回复 :) 我希望这能解决我的问题。我现在必须将结果输出到网格视图中,这会变得很复杂,哈哈:/
  • @stevendornan 这取决于您如何定义数据源。例如,在代码隐藏中,您可以说类似GridView1.DataSource = results 的内容,其中results 是运行查询返回的任何内容。我更喜欢 MVC 而不是 Forms,我也会为此使用 EF。
  • 我一直在 Visual Studio 2012 中使用 .Net 和 VB 开发这个系统,因为我在大学时就被教过。当用户选择两个日期并单击检查可用性按钮时,是否可能会在另一个页面上显示一个网格视图,显示基于您的查询的可用房间?如果这是有道理的。我非常感谢您的时间和精力:)!
  • 嗯,简短的回答是,无论技术如何,它都可以。但是样本等的正确答案将足以容纳评论。尝试将您置于正确的方向(希望如此),一种方法是创建一个带有网格的页面,该页面可以接受一个查询字符串(?arrival=...&departure=...)。在 Page_Load 上,您将从 db 添加查询字符串参数并使用结果填充 gridview 获得结果。在进行选择的页面上,您将有两个日期字段和一个将重定向到网格页面的提交按钮。
  • 我是 JOINing 那张桌子和ROOMS_BOOKED 桌子。因此结果将具有该列。很高兴能提供任何帮助。
【解决方案2】:

此查询列出所有房间,并显示每个房间是否在 [Arrival , Departure] 日期内可用

SELECT 
    RoomType,
    case when NOT EXISTS (SELECT RoomID 
                  FROM ROOMS_BOOKED rb 
                  JOIN BOOKING b on b.BookingID = rb.BookingID
                  WHERE rb.RoomID = r.Id 
                    and ArrivalDate < 'param Departure Date here'
                    and DepartureDate > 'param Arrival Date here')
        then 1 else 0 end IsAvailable
FROM ROOMS r

【讨论】:

    【解决方案3】:

    这是一个示例查询,我用于检查不可用的房间,查询将返回不可用的房间

    SELECT roomno FROM tbl_ReservedRooms WHERE ((fromdate BETWEEN @checkindate AND @checkoutdate )
    OR (todate BETWEEN @checkindate AND @checkoutdate)) 
    AND status = 'Active'
    

    【讨论】:

      【解决方案4】:

      SELECT * FROM room rm WHERE rm.Room_id NOT IN (SELECT DISTINCT Room_id FROM booking bk WHERE (bk.arrive_date BETWEEN '$from_date' AND '$to_date') OR (bk.departure_date BETWEEN '$from_date' AND '$ to_date') OR (bk.arrive_date'$to_date'))

      【讨论】:

      • 请解释您答案中的代码对技术新手的作用,以便他们能够理解和重新使用您的代码:-)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-03-23
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 2016-08-12
      相关资源
      最近更新 更多