首页 > 解决方案 > Access 2016 - 选择唯一的非重叠日期

问题描述

我需要查询许多具有开始和结束日期和时间字段的记录。如果有重叠的日期和时间,那么结果需要是最早的开始和最晚的结束。即 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

标签: ms-access

解决方案


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

在以下情况下发生冲突: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”,或打开报表。

请记住,日期部分可以包括“时间”部分,因此即使对于给定日期的预订或活动,上述查询也会返回任何重叠的日期/时间范围。

一旦你有了上述数据集(我假设你查询这个数据)。

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


推荐阅读