我试图为露营地写一个简单的预订程序。
我有一张露营地的桌子(露营地每个站点都有一张记录) 我有一张桌子,供访客使用露营地桌的身份证作为外键,以及入住日期和退房日期。
我需要做的是收集用户的潜在登记和退房日期,然后收集所有未在该日期范围内任何时间使用的露营地。
我认为我接近解决方案,但我似乎缺少一件。
我使用了2个查询。 1)收集在该日期范围内占用的所有露营地。 2)收集所有不在查询1中的露营地。
这是我的第一个问题:
SELECT Visitors.CampsiteID, Visitors.CheckInDate, Visitors.CheckOutDate
FROM Visitors
WHERE (((Visitors.CheckInDate)>=#CHECKINDATE#
And (Visitors.CheckInDate)<=#CHECKOUTDATE#)
Or ((Visitors.CheckOutDate)>=#CHECKINDATE#
And (Visitors.CheckOutDate)<=CHECKOUTDATE));
我想我错过了什么。如果#CHECKINDATE#和#CHECKOUTDATE#都出现在其他人的签到和退房日期之间,那么这并不能抓住它。
我知道我可以在两个查询之间进行拆分,其中一个只处理#CHECKINDATE#,第二个处理#CHECKOUTDATE#,但我认为这是一个更清洁的方法来做到这一点我和# 39;我只是没想出来。
这是我的第二个,我觉得它很好:
SELECT DISTINCT Campsites.ID, qryCampS_NotAvailable.CampsiteID
FROM Campsites LEFT JOIN qryCampS_NotAvailable
ON Campsites.ID = qryCampS_NotAvailable.CampsiteID
WHERE (((qryCampS_NotAvailable.CampsiteID) Is Null));
谢谢, 查尔斯
答案 0 :(得分:1)
要获取与请求的时间段重叠的记录,请使用此简单逻辑。当一个在另一个结束之前开始而另一个在第一次开始之后结束时,两个时间段重叠:
SELECT v.CampsiteID, v.CheckInDate, v.CheckOutDate
FROM Visitors v
WHERE v.CheckInDate <= #CHECKOUTDATE# and
v.CheckOutDate >= #CHECKINDATE# ;