Mysql为系统停机记录计算上一次结束时间和当前开始时间之间的分钟数
我需要帮助,我需要根据系统行计算当前事件的上一个结束日期和开始日期之间的差异(以分钟为单位) 这是表格:Mysql为系统停机记录计算上一次结束时间和当前开始时间之间的分钟数,mysql,datetime,row,difference,timestampdiff,Mysql,Datetime,Row,Difference,Timestampdiff,我需要帮助,我需要根据系统行计算当前事件的上一个结束日期和开始日期之间的差异(以分钟为单位) 这是表格: id |系统|开始|结束| ------------------------------------------------------------ 2 |系统1 | 2016-01-01 12:00:00 | 2016-01-01 13:00:00 | ------------------------------------------------------------ 3 |系统1 |
id |系统|开始|结束|
------------------------------------------------------------
2 |系统1 | 2016-01-01 12:00:00 | 2016-01-01 13:00:00 |
------------------------------------------------------------
3 |系统1 | 2016-01-02 11:00:00 | 2016-01-02 12:00:00|
------------------------------------------------------------
5 |系统1 | 2016-01-03 15:00:00 | 2016-01-03 16:00:00 |
------------------------------------------------------------
6 |系统2 | 2016-01-01 10:00:00 | 2016-01-01 11:00:00 |
------------------------------------------------------------
7 |系统2 | 2016-01-02 17:00:00 | 2016-01-02 18:00:00 |
结果是:
ID为2和6的两个系统记录之前没有进行减法的“结束日期”记录:
id | system | diff|u min |
---------------------------------
2 |系统1 | 0 |
---------------------------------
3 |系统1 | 1380 |
---------------------------------
5 |系统1 | 1620 |
---------------------------------
6 |系统2 | 0 |
---------------------------------
7 |系统2 | 1800 |
---------------------------------
您可以使用两个内置函数来实现这一点
select id, system, TIMESTAMPDIFF(MINUTE, endDate, startDate) diff_min
或
以下查询执行此操作:
SELECT
id,
system,
IF (@previousSystem = system, TIMESTAMPDIFF(MINUTE ,@previousEndTime,start),
@previousEndTime := 0) diff_min,
@previousSystem := system,
@previousEndTime := end
FROM
system_table,
(
SELECT
@previousSystem := NULL,
@previousEndTime := '0000-00-00 00:00:00'
) var
ORDER BY system, id;
输出:
在给定数据上运行上述查询,您将得到如下输出:
id system diff_min
2 system 1 0
3 system 1 1320
5 system 1 1620
6 system 2 0
7 system 2 1800
请忽略我的查询结果集中的最后两列此结果正确吗<代码>3 |系统1 | 1380。不应该是这样的吗?
3 system 1 1320
?仅用于示例的近似值。亲爱的1000111,我尝试了此可能的解决方案,但对于具有先前结束时间的系统,在diff_min列中得到了空值。请现在检查。我编辑了我的答案,还加了一把小提琴@杰尔马诺贾斯
SELECT
id,
system,
IF (@previousSystem = system, TIMESTAMPDIFF(MINUTE ,@previousEndTime,start),
@previousEndTime := 0) diff_min,
@previousSystem := system,
@previousEndTime := end
FROM
system_table,
(
SELECT
@previousSystem := NULL,
@previousEndTime := '0000-00-00 00:00:00'
) var
ORDER BY system, id;
id system diff_min
2 system 1 0
3 system 1 1320
5 system 1 1620
6 system 2 0
7 system 2 1800