根据日期和时间比较一个表与另一个表的数据。时间

时间:2012-07-16 07:25:49

标签: sql sql-server common-table-expression

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

下面是两个表Events & Bookings的示例数据我需要将bookings表格与基于Events的{​​{1}}表进行比较。显示有冲突的记录。

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

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

查询

Date & 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 BookingDate & Time进行比较我正在寻找基于性能的ms sql-query,因为这些表中的数据可以随之增长时间。

事件

Events Table

预订

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 ,现在与我们预订此日期的预订表冲突。我们需要找到这样的行,以便用户可以相应地采取行动,例如亲密的用户关于他们的预订取消&amp;等等。

情景&amp;详情

让我给你一个完整的图片我们允许我们在周一至周五的两个不同的时间上午10:30和第二个下午04:30参观私人博物馆,每次旅行我们最多可以参加50访客(人)。假设一群50人想在2012-08-15上午10:30访问博物馆,那么我们将在前端阻止这个日期。 Frond end是一个简单的Web表单,包含名称,地址,公司名称,访问者数量,时间(这是一个下拉菜单,上午10:30 am,下午04:30)和访问日期(这是一个日历控件)阻止已达到完整预订的日期&amp;将允许他们只选择那些可用的日期。

另一方面,博物馆还举办特别活动,他们可以在预订表格上阻止这些日期。假设一个活动安排在2012-08-10上午9:00 - 下午1:00&amp;这个日期早先被管理员阻止了。现在活动日期已更改为2012-08-25。由于之前没有安排这个日期的活动,所以博物馆有一些预订日期。

由于博物馆不能为在2012-08-25同一天预订的人进行任何旅行,因此需要通知。为此我需要比较两个表事件表和&amp;预订表,如果我们预订了2012-08-25 10:30,如果是,那么我们需要通过电子邮件告知访客取消他们的旅行。

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

我希望这会让我知道我正在寻找报告的数据类型。 我提到的查询工作正常,但我需要传递date&amp;的值。从预订表到预订表中每行的事件表的时间&amp;仅显示Booking表中与eventDate&amp;冲突的记录。时间

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

2012-07-25

1 个答案:

答案 0 :(得分:2)

假设+1小时实际意味着访问博物馆持续一小时,而这一小时不得与其他一些博物馆活动重叠,这是一个发现此类碰撞的查询。这是预订/活动当天两张桌子之间的简单连接,用于未取消的预订。使用expression explained here检查重叠间隔;实质上,范围A的开始日期中的两个范围重叠在范围B的结束日期之前,范围A的结束日期在范围B的开始日期之后。Afterbefore可能读取after or equalsbefore 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'

There is convenient SQL site called Sql Fiddle. I have put your sample and my answer there so you can check it online