用于搜索房间可用性的SQL查询

用于搜索房间可用性的SQL查询,sql,sql-server,Sql,Sql Server,我有以下表格: 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) 用户输入两个到达和离开日期。然后检查是否有空房。目前有

我有以下表格:

 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)
用户输入两个到达和离开日期。然后检查是否有空房。目前有一个房间已预订,我已将其插入数据库中。因此,预订表现在包括BookingID=1、CustomerID=1、到达日期=2015年3月24日、离开日期=2015年3月26日、人数=1、总成本=40.00。然后在预订的房间表中,我有BookingID=1和RoomID=2,这是一个标准房间

我正在使用以下sql代码-

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

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


请帮帮我,我相信有时你也会遇到同样的情况需要帮助。

你有以下情况

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
)

此查询列出所有房间,并显示每个房间在[到达、离开]日期内是否可用

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

下面是一个示例查询,我用来检查不可用的房间,该查询将返回不可用的房间

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

选择*FROM room rm WHERE rm.room\u id NOT IN从booking bk WHERE bk.arrival\u date在“$FROM\u date”和“$to\u date”之间选择不同的room\u id,或者选择bk.arrival\u date在“$FROM\u date”和“$to\u date”之间的bk.arright\u date”或bk.arright\u date在“$to\u date”之间选择不同的room\u id。

听起来您需要某种左连接,以便返回结果,但你也可以有条件地告诉他们是否已预订。可能的重复您不需要在查询中添加日期吗?如果我查询我的数据库以了解房间可用性,我会继续使用rooms表和booking表吗?或者我需要查询Rooms\u booked表吗?您使用的是哪种数据库管理系统?博士后?甲骨文?谢谢你的回复:我希望这能解决我的问题。我现在必须将结果输出到gridview中,这将变得很复杂lol://@stevendornan这取决于如何定义数据源。例如,在codebehind中,您可以说GridView1.DataSource=results,其中results是运行查询返回的结果。我更喜欢MVC而不是表单,我也会使用EF来实现这一点。我一直在visual studio 2012中使用.Net和VB开发这个系统,就像我在大学里学到的那样。当用户选择这两个日期并单击“检查可用性”按钮时,是否可能会在另一个页面上显示gridview,根据您的查询显示可用房间?如果这有道理的话。我真的很感谢你的时间和努力:!简言之,不管技术如何,它都能做到。但是,用样本等适当的答案将足够大,可以放在评论中。要想让你朝着正确的方向努力,希望有一种方法可以做到这一点,那就是有一个带有网格的页面,可以接受查询字符串?到达=…&离开=。。。。在页面_Load上,您将从添加querystring参数的db获得结果,并用结果填充gridview。在进行选择的页面上,您将有两个日期字段和一个提交按钮,该按钮将重定向到网格页面。我正在将该表与ROOMS_BOOKED表连接起来。因此,结果将包含该列。很高兴能为您提供帮助。请解释您答案中的代码对新技术人员的作用,以便他们能够理解并重新使用您的代码:-