SQL选择一个日期范围与另一个日期范围不相交的记录

时间:2014-04-22 02:50:34

标签: sql

我试图为露营地写一个简单的预订程序。

我有一张露营地的桌子(露营地每个站点都有一张记录) 我有一张桌子,供访客使用露营地桌的身份证作为外键,以及入住日期和退房日期。

我需要做的是收集用户的潜在登记和退房日期,然后收集所有未在该日期范围内任何时间使用的露营地。

我认为我接近解决方案,但我似乎缺少一件。

我使用了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));

谢谢, 查尔斯

1 个答案:

答案 0 :(得分:1)

要获取与请求的时间段重叠的记录,请使用此简单逻辑。当一个在另一个结束之前开始而另一个在第一次开始之后结束时,两个时间段重叠:

SELECT v.CampsiteID, v.CheckInDate, v.CheckOutDate
FROM Visitors v
WHERE v.CheckInDate <= #CHECKOUTDATE# and
      v.CheckOutDate >= #CHECKINDATE# ;