你好!
我有两张桌子,"房间"并且"忙碌"。我的繁忙餐桌包含预约记录,其中包含抵达日期和出发日期。
我希望在两个日期之前预订房间。
有人告诉我他希望保留房间的日期以及他打算离开的日期,我希望能够显示他可以使用的房间。
忙碌表=> | 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')
提前感谢您的帮助!
答案 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部分,以确保它们是正确的。此外,明智地使用一点布尔代数可以大大简化声明。
而且......我假设有人可以在出发日期到达。