在两个日期之间选择

时间:2018-02-12 21:16:19

标签: sql database ms-access

你好!

我有两张桌子,"房间"并且"忙碌"。我的繁忙餐桌包含预约记录,其中包含抵达日期和出发日期。

我希望在两个日期之前预订房间。

有人告诉我他希望保留房间的日期以及他打算离开的日期,我希望能够显示他可以使用的房间。

忙碌表=> | IdRoom || ArrivalDate | DepartureDate |

房间表=> | IdRoom | NumRoom |等等.. |

我尝试了不同的查询,但我什么也得不到。

我的测试查询:

SELECT Room.*, Busy.* 
FROM Room
INNER JOIN Busy ON Room.RoomdId= Busy.RoomdId
WHERE (@dateArr NOT BETWEEN 'Busy.ArrivalDate' AND 'Busy.DepartureDate') 
AND (@dateDep NOT BETWEEN 'Busy.ArrivalDate' AND 'Busy.DepartureDate')

提前感谢您的帮助!

4 个答案:

答案 0 :(得分:1)

好的,我已经更正了我的查询。

这是我使用的查询:

SELECT * 
FROM Room 
WHERE RoomId in (
             SELECT RoomID FROM Reservation WHERE EndDate <= @startDate OR  
             StartDate >= @endDate
             )

肯定有更好的方法可以做到这一点,但它确实有效。 谢谢大家的帮助;)

答案 1 :(得分:0)

首先,您的报价有问题。但我认为这可能只是把价值放在了问题上。

其次,您不希望busy的列。没有比赛所以他们没有兴趣。

然后重叠逻辑不正确。类似的东西:

SELECT r.*
FROM Room r LEFT JOIN
     Busy b
     ON r.RoomdId = b.RoomId AND
        @dateArr <= b.DepartureDate AND
        @dateDep >= b.ArrivalDate
WHERE b.RoomId IS NULL;

您的问题尚不清楚某人是否可以在出发日期到达(反之亦然)。如果是这样,<=>=可能需要失去相等比较。

编辑:

在MS Access中,您可以使用NOT EXISTS

SELECT r.*
FROM Room r LEFT JOIN
WHERE NOT EXISTS (SELECT 1
                  FROM Busy b
                  WHERE r.RoomdId = b.RoomId AND
                        @dateArr <= b.DepartureDate AND
                        @dateDep >= b.ArrivalDate
                 );

答案 2 :(得分:0)

查看表格的其他几列会很有帮助。你可能想考虑重构它们 - 它们似乎不是第三种正常形式。还不清楚BUSY表是否包含房间租用的所有时间的整个历史记录。如果BUSY仅包含当前预订,则此操作应该有效:

SELECT IdRoom 从忙碌 WHERE @ArrivalDate&gt; = DepartureDate AND @DepartureDate&lt; = ArrivalDate

答案 3 :(得分:0)

有4种情况,日期比较应该说房间很忙。 @Simonare通过使用繁忙房间的子选择,然后从主SELECT * FROM Room

中排除它们在正确的轨道上

我的kludgy小表说明了4种失败情况:

12345678 -> Eight Dates in a row.
..BBBB.. -> Assume: These four Dates are 'B' busy. 'D' dates below are desired/requested. 

.D...... -> Success: Desired is before busy dates
......D. -> Success: Desired is after busy dates
..DD.... -> Fails: Desired within busy dates
.DD..... -> Fails: Desired overlaps starting before beginning of busy dates
.....DD. -> Fails: Desired overlaps extending after ending of busy dates
.DDDDDD. -> Fails: Desired extends both before and after busy dates

这些是删除失败的WHERE条款:

在繁忙日期内请求:在到达日期之前或之后的繁忙到达日期和繁忙的出发日期LE所需的出发日期

SELECT 'Busy.DateArr' <= @dateArr AND  'Busy.DateDep' >= @dateDep

请求在繁忙开始之前开始:所需的到达日期是在繁忙的到达日期之前,所需的出发日期是在繁忙的到达日期之后)

SELECT @dateArr < 'Busy.DateArr' AND @dateDep > 'Busy.DateArr'

请求在忙碌结束后结束:所需的到达日期是在繁忙的出发日期之前,所需的出发日期是在繁忙的出发日期之后

SELECT @dateArr < 'Busy.DateDep' AND @dateDep > 'Busy.DateDep'

请求延伸至开始和结束之外结束:所需的抵达日期是在繁忙的抵达日期之前,所需的出发日期是在繁忙的出发日期之后

SELECT @dateArr < 'Busy.DateArr' AND  @dateDep > 'Busy.DateDep'

所以整个SQL变成......

SELECT * FROM Room
  WHERE NOT EXISTS ( 
   SELECT 1 FROM Busy WHERE Room.RoomdId= Busy.RoomdId AND
   ((@dateArr>= 'Busy.DateArr' AND @dateDep<= 'Busy.DateDep') OR
    (@dateArr < 'Busy.DateArr' AND @dateDep > 'Busy.DateArr') OR
    (@dateArr < 'Busy.DateDep' AND @dateDep > 'Busy.DateDep') OR
    (@dateArr < 'Busy.DateArr' AND @dateDep > 'Busy.DateDep') )
 )
道歉,我实际上并没有这样做,所以复杂性可能会出现逻辑或语法错误。您可以单独测试和调试每个SELECT部分​​,以确保它们是正确的。此外,明智地使用一点布尔代数可以大大简化声明。

而且......我假设有人可以在出发日期到达。