查询以查找日期不重叠的条目

时间:2016-03-07 19:39:00

标签: sql vba ms-access ms-access-2013

任何人都可以帮我创建一个查询,该查询将填充尚未预订的DJ列表。

我的用户将选择开始日期(和时间),结束日期(和时间) - 然后单击按钮选择DJ。

我只希望那些时段之间可用的DJ出现在列表中。

以下是涉及的两个表

tblDj

tblBooking

列表框中我需要的只是DJ号码和DJ名称

到目前为止,我有这个...但它没有工作:

SELECT tblDJ.DJ_No AS [DJ ID], tblDJ.DJ_Name AS Name FROM tblDJ
WHERE (((tblDJ.[DJ_No]) Not In
(SELECT tblBooking.[FK_DJ_No]
FROM tblBooking
WHERE ( (tblBooking.End_Date) >= 01-04-2020 19:30:00 )))) ....etc....

我现在只是在这里输入日期,但显然它会在实施后存储在变量中。

谢谢

2 个答案:

答案 0 :(得分:1)

SQL中的日期需要包含在两个#之间,以便MS-Access将其识别为日期:

select *
from tblDJ
where DJ_No not in
    (
    select FK_DJ_No 
    from tblBooking 
    where End_Date >= #2020-04-01 19:30:00#
    )

除此之外,您的查询将起作用。

答案 1 :(得分:1)

实现两个时间间隔的OVERLAPS看起来像:

1st_start_date <= 2nd_end_date and 1st_end_date >= 2nd_start_date

其中1st2nd值是不同事件的标记。

您可以将该逻辑与NOT EXISTS结合使用,以丢弃在给定时间不可用的dj:

select dj_no, dj_name
from tbldj d
where not exists (
    select 1
    from tblbooking b
    where b.fk_dj_no = d.dj_no
      and b.start_date <= #END DATE#
      and b.end_date >= #START DATE#
  )

您只需将#START DATE##END DATE#替换为您的值。

这确实有效,因为有以下假设:

  1. 第一个事件的开始日期早于该事件的结束日期
  2. 第二个事件的开始日期早于该事件的结束日期
  3. 这似乎合乎逻辑,对吧?