访问2016 - 选择唯一的非重叠日期

时间:2018-05-03 09:51:22

标签: ms-access

我需要查询许多具有开始日期和结束日期的记录。时间场。哪里有重叠日期&然后结果需要是最早的开始和最新结束。即     Main_ID timestart timeend
    40952 02/10/2014 06:00:00 02/10/2014 17:00:00
    40957 02/10/2014 10:00:00 02/10/2014 17:00:00
    40956 02/10/2014 15:00:00 02/10/2014 17:00:00
    40965 02/10/2014 18:30:00 04/10/2014
    40967 02/10/2014 20:00:00 02/10/2014 21:30:00
    40968 02/10/2014 21:30:00 04/10/2014
    40972 03/10/2014 03/10/2014 06:00:00
    40973 03/10/2014 03:00:00 03/10/2014 06:00:00
    40976 03/10/2014 04:00:00 03/10/2014 06:00:00
    40978 03/10/2014 06:00:00 03/10/2014 12:00:00
    40983 03/10/2014 13:00:00 03/10/2014 16:00:00
    40986 03/10/2014 15:00:00 03/10/2014 18:00:00
    40989 03/10/2014 18:00:00 03/10/2014 22:00:00
    40992 03/10/2014 22:00:00 05/10/2014
    87140 10/06/2015 21:10:00 12/06/2015
    87219 11/06/2015 11/06/2015 05:45:00
    87218 11/06/2015 21:00:00 13/06/2015

结果应该是:

Main_ID timestart Main_ID timeend  
40952 02/10/2014 06:00:00  40956 02/10/2014 17:00:00  
40965 02/10/2014 18:30:00  40992 05/10/2014  
87140 10/06/2015 21:10:00  87218 13/06/2015

1 个答案:

答案 0 :(得分:0)

为了防止碰撞,这里的逻辑非常简单:

发生碰撞时: RequestStartDate< = EndDate 和 RequestEndDate> = StartDate

以上是一个相当简单的查询,但如果发生任何碰撞,(包括任何重叠),上述将返回记录,而您根本不允许预订。换句话说,由于我们从不允许碰撞预订,因此上述简单声明对我们有用。

因此,要获得任何重叠类型,代码将如下所示:

dim strWhere                 as string 
dim dtRequeestStartDate      as date 
dim dtRequestEndDate         as date 


dtRequestStartDate = inputbox("Enter start Date") 
dtRequestEndDate = inputbox("Enter end date") 

strWhere="#" & format(dtRequestStartDate,"mm/­dd/yyyy") & "# <= EndDate" & _ 
 " and #" & format(dtRequestEndDate,"mm/dd­/yyyy") & "#  >= StartDate" 


if dcount("*","tableBooking",strWhere) > 0 then 
    msgbox "sorry, you can’t book 
    ...bla bla bla.... 

上面只是一个例子,我相信你会建立一个很好的表格,提示用户预订日期。但是,这里的好处是上面的简单条件确实会返回任何冲突。

您还可以使用上面的“where”子句来表示启动报告,从而显示给定日期范围的所有冲突。 (只需在openform的“where”参数中传递“strWhere”,或打开报告。

请注意,日期部分可以包含“时间”部分,因此即使对于某一天的预订或事件,上述查询也会返回重叠的任何日期/时间范围。

获得上述数据集后(我假设您查询此数据)。

此时,在结果数据集上,您可以简单地在开始列上执行dmin(),或者按降序排序以显示最早的时间。