【问题标题】:Time Overlapping sum时间重叠和
【发布时间】:2015-03-23 13:12:46
【问题描述】:

我有一个结构如下的表格:

id_task INTEGER,
task_begin DATETIME,
task_end DATETIME

我有这样的行:

id_task     task_begin              task_end
1           2015-03-23 09:00:00     2015-03-23 09:14:00
2           2015-03-23 09:10:00     2015-03-23 09:16:00
3           2015-03-23 09:18:00     2015-03-23 09:24:00
4           2015-03-23 09:21:00     2015-03-23 09:23:00
5           2015-03-23 09:24:00     2015-03-23 09:26:00
6           2015-03-23 09:26:00     2015-03-23 09:45:00
7           2015-03-23 09:30:00     2015-03-23 09:36:00
8           2015-03-23 09:34:00     2015-03-23 09:39:00
9           2015-03-23 09:05:00     null
10          null                    null
11          2015-03-23 10:02:00     2015-03-23 10:14:00
12          2015-03-23 10:04:00     2015-03-23 10:10:00
13          2015-03-23 10:03:00     2015-03-23 10:13:00
14          2015-03-23 10:10:00     null
15          2015-03-23 10:20:00     2015-03-23 10:30:00
16          2015-03-23 10:40:00     2015-03-23 10:50:00

我想选择没有重叠的实际工作时间。结果会是这样的:

task_begin              task_end
2015-03-23 09:00:00     2015-03-23 09:16:00
2015-03-23 09:18:00     2015-03-23 09:45:00 
2015-03-23 10:02:00     2015-03-23 10:14:00
2015-03-23 10:20:00     2015-03-23 10:30:00
2015-03-23 10:40:00     2015-03-23 10:50:00

如何使用 SELECT 或 MySQL 中的过程来执行此操作?

【问题讨论】:

  • 过程语言比 SQL 更容易。
  • @RickJames 也许你是对的,我换个问题,我愿意接受任何解决方案。
  • 在试图让您远离 SQL 时,我已经包含了存储过程。也许@fancyPants 有一个很好的解决方案。
  • @RickJames 我想在 MySQL 中解决,因为它的计算速度比任何服务器端代码都快,这个例子将根据我的实际问题进行扩展。这个问题将在视图中使用。

标签: mysql datetime select view procedure


【解决方案1】:
SELECT MIN(task_begin) AS task_begin, MAX(task_end) AS task_end
FROM (

    SELECT
    t.*,
    @rc := IF(@prev_task_end >= task_begin, @rc, @rc + 1) AS rc,
    @prev_task_end := task_end
    FROM
    t,
    (SELECT @rc := 0, @prev_task_end := null) var_init_subquery
    ORDER BY id_task

) sq
GROUP BY rc
HAVING task_begin IS NOT NULL OR task_end IS NOT NULL
  • sqlfiddle 中实时查看它的工作情况
  • here 您可以阅读更多关于在查询中使用变量的信息

【讨论】:

  • 工作得又快又好!我可以通过 setter 和 getter 函数使用视图中的会话变量 :)
猜你喜欢
  • 2017-06-09
  • 2019-04-12
  • 1970-01-01
  • 2021-04-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-17
相关资源
最近更新 更多