2016-05-17 62 views
2

我需要帮助,我需要计算在以前结束日期和当前事件的开始日期分钟之间的差别,根据系统行。Mysql的计算分钟记录

这是表:

id |system |start |end | ------------------------------------------------------------ 2 | system 1 | 2016-01-01 12:00:00 | 2016-01-01 13:00:00 | ------------------------------------------------------------ 3 | system 1 | 2016-01-02 11:00:00 | 2016-01-02 12:00:00 | ------------------------------------------------------------ 5 | system 1 | 2016-01-03 15:00:00 | 2016-01-03 16:00:00 | ------------------------------------------------------------ 6 | system 2 | 2016-01-01 10:00:00 | 2016-01-01 11:00:00 | ------------------------------------------------------------ 7 | system 2 | 2016-01-02 17:00:00 | 2016-01-02 18:00:00 |

这是结果:

与ID 2和6,这两个系统的记录有“结束日期”的没有事先记录,以使减法:

id | system | diff_min | --------------------------------- 2 | system 1 | 0 | --------------------------------- 3 | system 1 | 1380 | --------------------------------- 5 | system 1 | 1620 | --------------------------------- 6 | system 2 | 0 | --------------------------------- 7 | system 2 | 1800 | ---------------------------------

+0

是这样的结果正确的最后两列? '3 |系统1 | 1380'。它不应该是这样的系统吗?1 \t 1320'? – 1000111

+0

仅用于示例的近似值。 –

回答

0

下面的查询做到这一点:

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 

SQL FIDDLE

请忽略结果集中我的查询

+0

尊敬的1000111,我尝试了这种可能的解决方案,但是我得到了具有上一次结束时间的系统的diff_min列中的空值。 –

+0

请立即检查。我编辑了我的答案,并添加了小提琴。 @GermánRojas – 1000111

+0

改变是否奏效? @GermánRojas – 1000111

0

您可以使用两个内置函数

01实现这一目标
select id, system, TIMESTAMPDIFF(MINUTE, endDate, startDate) diff_min 

select id, system, TIMEDIFF(endDate, startDate)/60 as diff_min 
0
select id,system,TIMESTAMPDIFF(MINUTE,end,start) as diff_min from table_name;