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

问题描述:

我必须比较两个表之间的数据并检查是否存在任何冲突。根据日期和时间比较一个表与另一个表的数据

下面是两个表Events & Bookings样本数据,我需要根据Date & Time &节目记录它们在冲突Events表比较bookings表。

其实用户可以改变事件的日期&时间一旦日期更改用户需要生成报告,将显示他们,如果他们已经有任何预定特定日期&时隙。

我使用下面的查询来检查,如果我们有任何预定的更新事件

查询

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 & TimeEvents Table我正在寻找基于性能的MS SQL查询,因为这些表中的数据可能会随着时间而增长。

活动

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 

在theabove情况下,我们假设用户有改变第一个事件的日期2012-07-25现在与预订表的冲突,我们有预订这一天。我们需要找到这样的行,以便用户可以采取相应的行动,如亲密的用户关于他们的预订取消&等。

方案&详细

让我给你一个完整的画面,我们能够让我们说私人博物馆从周一之旅 - 在两个不同的时间在一个星期五的上午10:30和第二个在下午4时30每次参观我们最多可以容纳50位参观者(人)。假设一群50人想在上午10点30分在2012-08-15参观博物馆,那么我们将在前台*这个日期。 叶子端是一个简单的网页形式,具有常见的字段,如姓名,地址,公司名称,访客数量,时间(这是一个有两个条目10:30 am04:30pm的下拉列表)和访问日期(这是一个日历控制,阻止日期已达到完整预订&将允许他们只选择那些可用的日期

另一方面博物馆也组织特殊事件,他们可以在预订表格上阻止这些日期假设事件原定于2012年8月10日上午9:00 - 下午1:00 &此日期早些时候由管理员阻止,现在事件日期已更改为2012-08-25。由于此日期没有事件安排早些时候博物馆为此预定了一些日期。

由于博物馆不能为已经预约的人同行2012-08-25需要被告知。为此,我需要比较两个表事件表&预订表,并发现如果我们有任何预订在2012年10月30日10:30如果是的话,那么我们需要通过电子邮件关注他们的旅游取消。

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

我希望这会给出我正在寻找报告的数据类型。我刚才所说的 查询工作正常,但我需要从预订表通过之日起&时间值的事件表在预订表&每行仅表明的预订表的记录与EVENTDATE &时间

期望中的冲突输出 从样本数据我需要一个查询,它会显示我只当它与预订冲突以下记录事件的日期改为

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

我不明白你想要做什么。但是,作为一个方面说明,如果你是在性能之后,你将不得不停止将数据从一种类型转换为另一种类型,因为[大多数转换和函数不是可靠的](http://en.wikipedia.org/wiki/Sargable) 。这使得索引不可用。另外,在处理日期时,而不是'> = = 2012-07-16 09:17:13

+0

@尼古拉,我可以根据你的建议工作,如果能帮助我用这个查询来获得想要的结果,我将不胜感激。稍后我会更改数据类型以改善性能。 – Learning 2012-07-16 09:37:28

+0

我很乐意帮忙,但不幸的是我不明白这个问题。 – 2012-07-16 09:42:23

后假设1小时实际上意味着要参观博物馆持续一小时,并且这一小时不能与其他一些博物馆活动重叠,这里是查询发现这种碰撞的查询。这是在预订/活动日期的两个表格之间的简单连接,对于未被取消的预订。 Ovelapping间隔使用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' 

+0

完美适合我,我只需要根据自己的需求进行更改即可。感谢您的时间和精力。 – Learning 2012-07-16 11:40:15

+0

@KnowledgeSeeker我很高兴能帮到你。 – 2012-07-16 11:52:51