根据日期和时间比较一个表与另一个表的数据
我必须比较两个表之间的数据并检查是否存在任何冲突。根据日期和时间比较一个表与另一个表的数据
下面是两个表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 & Time
与Events 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小时实际上意味着要参观博物馆持续一小时,并且这一小时不能与其他一些博物馆活动重叠,这里是查询发现这种碰撞的查询。这是在预订/活动日期的两个表格之间的简单连接,对于未被取消的预订。 Ovelapping间隔使用expression explained here;基本上,范围A的开始日期中的两个范围重叠在范围B的结束日期之前并且范围A的结束日期在范围B的开始日期之后。根据定义重叠的方式,After
和before
可能会读取after or equals
或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'
。
完美适合我,我只需要根据自己的需求进行更改即可。感谢您的时间和精力。 – Learning 2012-07-16 11:40:15
@KnowledgeSeeker我很高兴能帮到你。 – 2012-07-16 11:52:51
我不明白你想要做什么。但是,作为一个方面说明,如果你是在性能之后,你将不得不停止将数据从一种类型转换为另一种类型,因为[大多数转换和函数不是可靠的](http://en.wikipedia.org/wiki/Sargable) 。这使得索引不可用。另外,在处理日期时,而不是'> = = 2012-07-16 09:17:13
@尼古拉,我可以根据你的建议工作,如果能帮助我用这个查询来获得想要的结果,我将不胜感激。稍后我会更改数据类型以改善性能。 – Learning 2012-07-16 09:37:28
我很乐意帮忙,但不幸的是我不明白这个问题。 – 2012-07-16 09:42:23