【问题标题】:Find overlapping or conflicting time intervals查找重叠或冲突的时间间隔
【发布时间】:2013-07-02 19:55:19
【问题描述】:

您好,我对 mysql 查询 (DQL) 有疑问

表:

id| start | end   | day
-------------------------------
1 | 10:00 | 11:00 | 03-05-2013
2 | 11:00 | 12:00 | 03-05-2013
3 | 10:30 | 12:00 | 03-05-2013
4 | 13:00 | 14:00 | 03-05-2013
5 | 14:00 | 15:00 | 03-05-2013

因此,我只想获取(列:id、start、end)在开始和结束之间具有相同部分的行。因此,我想得到:

id| start | end   
------------------
1 | 10:00 | 11:00 
2 | 11:00 | 12:00 
3 | 10:30 | 12:00 

因为第 1 行和第 3 行之间的时间相同:10:30 和 11 之间,而第 2,3 行在 11:00 到 12:00 之间的时间相同

我希望很清楚我想要得到什么作为输出。 很高兴在 DQL 语法中得到教义的答案。

【问题讨论】:

  • 。 .为什么不得到第 4 行和第 5 行?这些似乎满足与 1 和 2 相同的条件。
  • 因为第 4 行和第 5 行在时间上是独立的,所以在这些行的开始和结束之间没有其他行

标签: mysql sql doctrine-orm doctrine dql


【解决方案1】:

您需要自加入表并查找对之间的冲突

SELECT 
  t1.id,
  t1.start,
  t1.end
FROM table_name t1
JOIN table_name t2
WHERE
  t1.start < t2.end AND
  t2.start < t1.end AND
  t1.id <> t2.id AND
  t1.date = t2.date

您可以使用 SELECT DISTINCT 或 GROUP BY 来修剪输出中的重复项。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-01-10
    • 2020-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-22
    相关资源
    最近更新 更多