1

我必须比较两个表之间的数据并检查是否有任何冲突。

下面是两个表的示例数据,Events & Bookings我需要根据& 显示冲突的记录将bookings表与表进行比较。EventsDate & Time

实际上,一旦日期更改,用户可以更改活动日期和时间,用户需要生成报告,如果他们已经对该特定日期和时间段进行了任何预订,则该报告将显示他们。

我正在使用以下查询来检查我们是否有任何更新活动的预订

询问

Declare @bTime varchar(10) = '10:30';
Declare @bDate date = '2012-08-15';
SELECT * FROM  EventDatesReporting   WHERE 
((CONVERT(time(0), EventStartTime) <= CONVERT(time(0),@bTime )  
    AND CONVERT(time(0), EventEndTime) >= CONVERT(time(0),@bTime ))
OR 
(CONVERT(time(0), EventStartTime) <= DATEADD(minute,59,CONVERT(time(0), @bTime))   
    AND CONVERT(time(0), EventEndTime) >= DATEADD(minute,59,CONVERT(time(0), @bTime))))
AND EventDates = @bDate

上面的查询工作正常,但我需要转换此查询,以便我可以将 Booking 表BookingDate & TimeEvents Table我正在寻找基于性能的 ms sql-query 进行比较,因为这些表中的数据会随着时间增长。

活动

EventID EventStartDate  EventEndDate    EventDates  DT        EventStartTime    EventEndTime
17      2012-07-25      2012-07-26      2012-07-25  2012-07-25  10:00:00        12:00:00
17      2012-07-25      2012-07-26      2012-07-26  2012-07-26  10:00:00        12:00:00
21      2012-05-28      2012-05-28      2012-05-28  2012-05-28  18:00:00        19:00:00
26      2012-01-01      2015-01-01      2012-07-01  2012-07-01  08:00:00        18:00:00

预订

BookingID   TotalVisitors   BookingDate Time    BookingCancelled
1900221519  5               2012-07-10  10:30   0
5600515751  1               2012-07-20  10:30   0
8044913913  41              2012-07-05  10:30   0
1638934678  5               2012-07-20  10:30   1
5685687635  9               2012-07-25  10:30   0

在上述情况下,我们假设用户更改了 2012-07-25与预订表冲突的第一个事件的日期,因为我们已经预订了该日期。我们需要找到这样的行,以便用户可以采取相应的行动,例如关于他们的预订取消等的亲密用户。

场景和细节

让我给你一张完整的照片,我们允许参观让我们说私人博物馆从周一到周五在两个不同的时间,一个在上午 10:30,第二个在下午 4:30,每次旅行我们最多可以接待 50 名游客(人)。假设一组 50 人想在 2012 年 8 月 15 日上午 10:30 参观博物馆,那么我们将在前端阻止这个日期。前端是一个简单的 Web 表单,具有常见字段,如姓名、地址、公司名称、访客人数、时间(这是一个下拉菜单,包含两个条目,上午 10:30,下午 4:30)和访问日期(这是一个日历控件这会阻止已达到完整预订的日期,并允许他们仅选择可用的日期。

另一方面,博物馆还组织特别活动,他们可以在预订表格上屏蔽这些日期。假设一个活动原定于 2012 年 8 月 10 日上午 9:00 至下午 1:00 举行,而该日期被管理员提前阻止。现在活动日期已更改为 2012-08-25。由于该日期之前没有安排任何活动,因此博物馆在该日期进行了一些预订。

由于博物馆不能为在 2012 年 8 月 25 日同一日期预订的人进行任何游览,因此需要通知。为此,我需要比较两个表事件表和预订表,如果我们在 2012 年 8 月 25 日 10:30 有任何预订,那么我们需要通过电子邮件通知游客取消他们的旅行。

在我的查询中,我还增加了 59 分钟的时间,因为我们需要在 EventStartTime 或 EventEndTime 之间至少休息 1 小时。

我希望这能让我了解我正在寻找什么样的数据报告。我提到的查询工作正常,但我需要将预订表中每一行的日期和时间值传递到事件表,并仅显示预订表中与 eventDate 和时间冲突的记录

所需输出 从示例数据中,我需要一个查询,该查询将仅向我显示以下记录,就好像它与更改事件日期后的预订冲突一样

EventID BookingID   TotalVisitors   BookingDate Time    BookingCancelled
17      5685687635  9               2012-07-25  10:30   0
4

1 回答 1

2

假设 +1 小时实际上意味着参观博物馆持续一小时,并且这一小时不能与其他博物馆活动重叠,这里是一个查找此类冲突的查询。这是预订/活动日期两个表之间的简单连接,用于未取消的预订。使用此处解释的表达式检查椭圆间隔;本质上,两个范围在范围 A 的开始日期重叠在范围 B 的结束日期之前,并且范围 A 的结束日期在范围 B 的开始日期之后。After并且before可能读为after or equalsor before or equals,具体取决于您如何定义重叠。

select e.EventID,
       b.BookingID,
       b.TotalVisitors,
       b.BookingDate,
       b.Time,
       b.BookingCancelled
  from EventDatesReporting e
 inner join Bookings b
   -- On same date
    on e.EventDates = b.BookingDate
   -- Overlapping intervals
   and e.EventEndTime >= cast(b.Time as Time)
   and e.EventStartTime < dateadd (hour, 1, cast(b.Time as Time))
   -- Only if booking is not cancelled
   and b.BookingCancelled = 'false'

有一个方便的 SQL 站点,称为 Sql Fiddle。我已将您的样本和我的答案放在那里,以便您可以在线查看

于 2012-07-16T11:17:26.047 回答