当前位置: 首页 > 面试题库 >

MySQL-查找时间重叠

徐翔
2023-03-14
问题内容

我在数据库中有2个表,这些表具有以下属性:

Booking
=======
booking_id
booking_start
booking_end

resource_booked
===============
booking_id
resource_id

第二个表是“预订”和“资源”之间的关联实体(即1个预订可以包含许多资源)。属性booking_start和booking_end是带有日期和时间的时间戳。

我是否可以知道如果日期/时间与其他类似resource_id的预订重叠或冲突,我如何能够找到每个resource_id(预订的)?

我以图形方式在纸上涂上答案,以查看它是否可以帮助我形象化如何解决此问题,并得到以下信息:

  1. 将2个表(Booking,Booked_resource)连接到一个具有4个所需属性的表中。
  2. 请按照此处建议的答案:在一个表中查找重叠的(日期/时间)行

我做了第1步,但第2步让我感到困惑!

我真的很感谢在此方面的任何帮助!谢谢!

编辑:我正在阅读Renshaw先生的答案,并尝试自己做一个,看看是否理解,然后我明白了:

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结合在一起,查找具有相似资源ID但具有不同booking_id的记录,并查看一个(booking_id)的booking_start日期时间是否在另一个(booking_id)的booking_start和booking_end之间。

真的很乱,我什至不确定我的查询是否在问我在想什么,但奇迹般地,我得到了与伦肖先生相同的答案!


问题答案:

编辑:使用其他信息,现在仅限于仅显示与某些较早的预订冲突的预订。

我认为这可以解决问题:

SELECT DISTINCT
    b2.booking_id, -- The later booking
    b2.booking_start,
    b2.booking_end,
    b2.creation_date,
    rb1.resource_id, -- The resource over which the two bookings clash
    b1.booking_id, -- The earlier booking
    b1.booking_start,
    b1.booking_end
FROM resource_booked rb1
    INNER JOIN booking b1 ON b1.booking_id = rb1.booking_id
    INNER JOIN booking b2 ON b1.booking_id <> b2.booking_id
        AND b2.booking_start BETWEEN b1.booking_start AND b1.booking_end
    INNER JOIN resource_booked rb2 ON rb2.resource_id = rb1.resource_id
        AND rb2.booking_id = b2.booking_id

这是如何测试的:

use tempdb

drop table resource_booked 
drop table Booking

create table Booking
(
    booking_id int,
    booking_start datetime,
    booking_end datetime,
    creation_date datetime
)

create table resource_booked 
(
    booking_id int,
    resource_id int
)

insert Booking values (1, '1 january 2000', '1 march 2000', '1 january 2000')
insert Booking values (2, '1 february 2000', '1 may 2000', '2 january 2000')
insert Booking values (3, '1 april 2000', '1 june 2000', '3 january 2000')
insert Booking values (4, '1 july 2000', '1 august 2000', '4 january 2000')

insert resource_booked values (1, 1)
insert resource_booked values (2, 1)
insert resource_booked values (3, 1)
insert resource_booked values (4, 1)
insert resource_booked values (1, 2)
insert resource_booked values (3, 2)


 类似资料:
  • 假设我有一个如下所示的验证表。 在上表中,如果我们观察到场景id 1和3具有相同的验证id 100、101和102。 在这种情况下,我可以说scenario_id=1是scenario_id=3的重复。 我可以得到一个MySql查询来找到这样的重复。 提前谢谢。

  • 问题内容: 范例: 在此表中,我需要获得Empid 1作为输出。因为它的bookid 8不止一次。 提前致谢.. 问题答案: 您可以使用: 但这会给您重复的内容。例如,如果您有1-8,1-8,1-9,1-9,则会得到1,1的输出,因为Empid 1具有两个不同bookid值的重复bookid。您将需要使用来过滤出重复的Empid。

  • 我有一个数据集myTable,它具有ISO 8601时间/日期值。它看起来像这样: 我想找到持续时间(每个用户名的maxTime和minTime之间的差异)。我查看了这篇文章,但它仅适用于C,并且需要使用正则表达式。我想知道是否有更简单的方法或库函数可以找到ISO 8601格式的持续时间?

  • 问题内容: 我想从间隔与查询中指定的间隔相交的表中提取行。假设我有一个简单的表和两个查询参数,并且,表达查询的最简单方法是什么,以便找到具有至少一个公共元素的所有行? 更新: 为了使预期结果更加清晰,请在下面找到输入值和预期结果的列表。列是 。 问题答案: 更简单:

  • 我有一个疑问。我有一个表,其中有些记录重复日期时间。我必须把最后一个从日期时间重复的地方拿来。示例: 它应该返回ID3、4和7 你能帮我吗?谢谢!

  • 问题内容: 我想在MySQL数据库中提取重复记录。这可以通过以下方式完成: 结果是: 我想将其拉出,以使其显示重复的每一行。就像是: 关于如何做到这一点有什么想法?我试图避免做第一个,然后在代码中用第二个查询查找重复项。 问题答案: 关键是重写此查询,以便可以将其用作子查询。