我正在研究课堂预订工具。核心组件是能够将请求的日期范围与现有预留进行比较,以确保没有重叠。我在这里阅读了几个与日期范围相关的问题,并研究了萨尔曼对艾伦间隔代数(SQL Query to Find Overlapping (Conflicting) Date Ranges)的解释和实现,直到我理解为止。这是我提出的精简版。
tblRooms
roomID room
5 110
30 178
tblReservations
reservedID fkRoom dateIn dateOut
1 5 3/10/2017 3/15/2017
2 5 3/1/2017 3/3/2017
4 5 4/1/2017 4/30/2017
SELECT DISTINCTROW tblRooms.roomID, tblRooms.room
FROM tblRooms LEFT JOIN tblReservations
ON tblRooms.roomID = tblReservations.fkRoom
WHERE NOT Exists (
SELECT DISTINCT tblRooms.roomID
FROM tblRooms
WHERE ((tblReservations.[dateOut] >= #3/3/2017#)
AND (#3/9/2017# >= tblReservations.[dateIn])));
我得到了不一致的回报。这些日期将不包括110室。其他测试输入(#3/4/2017#和#3/10/2017#,#4/1/2017#和#4/14/2017#)不会。我尝试过“WHERE NOT(...”,“WHERE Exists()= False”等组合。
我在一个高度限制性的网络上工作,我无法随意提取模板 - 我创建数据库时唯一的选择是“空白”和“网络”,所以我必须自己动手。我感谢任何协助。
答案 0 :(得分:1)
您可以尝试以下方法:
SELECT DISTINCTROW tblRooms.roomID, tblRooms.room
FROM tblRooms
WHERE NOT Exists (
SELECT 1
FROM tblReservations
WHERE
tblReservations.fkRoom = tblRooms.roomID
AND ((tblReservations.[dateOut] >= #3/3/2017#)
AND (#3/9/2017# >= tblReservations.[dateIn])));
答案 1 :(得分:1)
对于预订检查查询,您可以这样做:
select ...
from tblRooms room
where not exists
( select *
from tblReservations r
where r.fkRoom = room.roomId and
end > r.[datein] and start < r.[dateout] );
但重要的是,通过那些结束并作为参数开始而不是像你那样的硬编码值。使用硬编码值时,您始终可以获得错误的结果或错误。例如:
#3/9/2017#
真的吗?它的解释取决于区域设置(我不是访问程序员,所以我可能错了)。