我在数据库中具有2代表具有以下属性:的MySQL - 寻找时间重叠
Booking
=======
booking_id
booking_start
booking_end
resource_booked
===============
booking_id
resource_id
第二个表是“预定”和“资源”之间的关联实体(即,1个预订可以包含许多资源)。属性booking_start和booking_end是包含日期和时间的时间戳。
我可以知道,如果日期/时间与其他类似resource_id的预订重叠或发生冲突,我是否可以找出每个resource_id(resource_booked)?
我涂鸦在纸上的答案,以图形,看它是否会帮助我想象我怎么能解决这个问题,我得到这个:
- 加入了2个表(预订,Booked_resource)到一个表与所需的4个属性。
- 按照建议的答案在这里:Find overlapping (date/time) rows within one table
我做了第一步,但第二步是让我百思不得其解!
我真的很感激任何帮助!谢谢!
编辑: 我读伦肖先生的答案,并试图做一个对我自己,看看我的理解,我得到了这个概念:
SELECT
a.*
FROM
(SELECT
b.creation_date,
b.booking_id,
r_b.resource_id,
b.booking_start,
b.booking_end
FROM Booking b
INNER JOIN resource_booked r_b ON b.booking_id = r_b.booking_id) as a,
(SELECT
b.booking_id,
r_b.resource_id,
b.booking_start,
b.booking_end
FROM Booking b INNER JOIN resource_booked r_b ON b.booking_id = r_b.booking_id) as
WHERE
a.resource_id = b.resource_id
AND
a.booking_id <> b.booking_id
AND
a.booking_start BETWEEN b.booking_start AND b.booking_end
AND
a.creation_date >= b.creation_date
我认为我试图创建2个相同的表并使用resource_id加入它们,查找具有相似资源标识但booking_id不同的记录,并查看其中一个(booking_id)的booking_start datetime是否位于另一个(booking_id)的booking_start和booking_end之间。
这真的很混乱,我甚至不确定我的问题是否在问我脑海里有什么奇迹,但是我得到了和Renshaw先生一样的答案!
出于某种原因,我收到了某些记录的“重复项目”: * b2.booking_id | B2。creation_date | rb1.resource_id | b1.creation_date | b1.booking_id * ** 23 | 2006-08-31 13:21:25.0 | 12 | 2006-09-05 14:12:17.0 | 21 ** 另外一行如下: ** 21 | 2006-09-05 14:12:17.0 | 12 | 2006-08-31 13:21:25.0 | 23 ** – Cuppy 2010-04-28 09:16:43
我添加了另一个WHERE子句,用于检查b1.creation_date> = b2.creation_date,以便只有稍后做出的预订才会显示,并且它似乎有效!再次感谢! – Cuppy 2010-04-28 09:29:13