首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >返回超出范围的结果

返回超出范围的结果
EN

Stack Overflow用户
提问于 2015-06-24 08:57:26
回答 2查看 26关注 0票数 0

我正在尝试用.NET做一个预订系统。我有一个数据库,里面有一个叫做Booking、房间和BookingRoom的表。

Room包含Room.RoomID形式的房间号。BookingRoom只有两列: RoomID和BookingID。Booking有几个列,但我想使用的是CheckInDate和CheckOutDate以及BookingID的列。

-> BookingRoom -> Booking

这就是我现在的位置:

代码语言:javascript
复制
SELECT DISTINCT r.RoomID
FROM Room r
RIGHT JOIN BookingRoom br ON br.RoomID = r.RoomID
RIGHT JOIN Booking b ON b.BookingID = br.BookingID
RIGHT JOIN Rates ra ON r.RateID = ra.RateID
WHERE (b.CheckInDate < '2015/06/21 00:00:00' OR b.CheckInDate > '2015/06/27 23:59:59.999') AND (b.CheckOutDate < '2015/06/27 00:00:00' OR b.CheckOutDate > '2015/06/21 23:59:59.999');

不幸的是,这给了我一个所有房间的列表,因为虽然它排除了该范围内的房间,但房间号与它在外部的另一个预订相匹配。

现在我再也想不出是否可以返回一个房间列表,不包括那些在CheckInDate和CheckOutDate范围内匹配日期的房间。

EN

回答 2

Stack Overflow用户

发布于 2015-06-24 09:01:49

您可以使用NOT EXISTS

代码语言:javascript
复制
SELECT
    r.RoomID
FROM Room r
WHERE
    NOT EXISTS(
        SELECT 1
        FROM Booking b
        INNER JOIN BookingRoom br
            ON br.BookingID = b.BookingID
        WHERE
            (b.CheckInDate < '2015/06/21 00:00:00' OR b.CheckInDate > '2015/06/27 23:59:59.999') 
            AND (b.CheckOutDate < '2015/06/27 00:00:00' OR b.CheckOutDate > '2015/06/21 23:59:59.999')
            AND br.RoomID = r.RoomID
    )
票数 0
EN

Stack Overflow用户

发布于 2015-06-24 09:02:36

如果我没记错的话,您想要一段时间内没有预订的房间。一种相当直接的方法是使用EXISTS

代码语言:javascript
复制
SELECT r.*
FROM Room r
WHERE NOT EXISTS (SELECT 1
                  FROM BookingRoom br JOIN
                       Booking b
                       ON b.BookingID = br.BookingID
                  WHERE b.CheckInDate < '2015-06-28' AND
                        b.CheckOutDate >= '2015-06-21' 
                 )

请注意,我更改了日期算法,以便它可以找到任何重叠。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31015877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档