计算2(非连续)行之间的时差

时间:2019-10-23 19:33:38

标签: mysql sql

我是SQL的新手,我想比较两个小时,看看“差异计划”和“差异完成”列中各行之间的区别。

我该如何实现?

谢谢! :)

date                id          planned     done       diff plan    diff done
21/10/2019 00:00    3252250 A   05:00:00    04:59:04        NULL      NULL
21/10/2019 00:00    3251855 A   05:00:00    05:00:18    00:00:00    00:01:14
21/10/2019 00:00    3251868 A   05:07:00    05:07:30    00:07:00    00:07:12
21/10/2019 00:00    3252291 A   05:10:00    05:10:47    00:03:00    00:03:17

2 个答案:

答案 0 :(得分:1)

这里是MySQL <8.0的解决方案,其中窗口功能不可用。假设done列可用于对记录进行排序(如果与您的用例更相关,则可以将done的所有出现更改为其他列):< / p>

select
    t.*,
    timediff(t.planned, tlag.planned) diff_plan,
    timediff(t.done,    tlag.done) diff_done
from mytable t
left join mytable tlag
    on tlag.done < t.done
    and not exists (
        select 1
        from mytable t1
        where t1.done < t.done and t1.done > tlag.done
    )
order by t.done

这可以通过将每个记录与其先前的记录进行自我连接来实现(为此,我们使用带有关联子查询的not exists条件),以确保当前记录与被连接的记录之间没有记录)。然后,我们使用函数timediff()计算列planneddone的时间差。

Demo on MySQL 5.6 DB Fiddle

样本数据:

| date       | id      | planned  | done     |
| ---------- | ------- | -------- | -------- |
| 2019-10-21 | 3252250 | 05:00:00 | 04:59:04 |
| 2019-10-21 | 3251855 | 05:00:00 | 05:00:18 |
| 2019-10-21 | 3251868 | 05:07:00 | 05:07:30 |
| 2019-10-21 | 3252291 | 05:10:00 | 05:10:47 |

结果:

| date       | id      | planned  | done     | diff_plan | diff_done |
| ---------- | ------- | -------- | -------- | --------- | --------- |
| 2019-10-21 | 3252250 | 05:00:00 | 04:59:04 |           |           |
| 2019-10-21 | 3251855 | 05:00:00 | 05:00:18 | 00:00:00  | 00:01:14  |
| 2019-10-21 | 3251868 | 05:07:00 | 05:07:30 | 00:07:00  | 00:07:12  |
| 2019-10-21 | 3252291 | 05:10:00 | 05:10:47 | 00:03:00  | 00:03:17  |

答案 1 :(得分:0)

请查看link。它可能会帮助您。

TIMEDIFF函数将发现两次之间的差异。