MS Access SQL日期范围查询

时间:2017-04-04 14:04:20

标签: sql ms-access

我正在研究课堂预订工具。核心组件是能够将请求的日期范围与现有预留进行比较,以确保没有重叠。我在这里阅读了几个与日期范围相关的问题,并研究了萨尔曼对艾伦间隔代数(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”等组合。

我在一个高度限制性的网络上工作,我无法随意提取模板 - 我创建数据库时唯一的选择是“空白”和“网络”,所以我必须自己动手。我感谢任何协助。

2 个答案:

答案 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#真的吗?它的解释取决于区域设置(我不是访问程序员,所以我可能错了)。