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

Query to find out entries where dates don't overlap

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

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

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

这里是涉及到的两个表

列表框中我只需要 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....

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

谢谢

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#
    )

除此之外您的查询将有效。

实现两个间隔的 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. 第二个活动的开始日期早于该活动的结束日期

这似乎合乎逻辑,对吧?