2013-07-24 39 views
2

我有car_history表,我需要找到在所选日期的每个car_status之间的时间差。MySQL组行查找时间差

e.g 1. to_load - 9 h. 2. to_load - 8 h.等等...

我怎样才能找到id = 1 to id = 4id = 8 to id = 10 条目数日志怎么了to_load状态。

-------------------------------------------------------------------- 
    | id | car_id | car_status | comments  | entry_date   | 
    -------------------------------------------------------------------- 
    | 1 | 1 | to_load | preparing  | 2013-06-12 08:00:00| 
    | 2 | 1 | to_load | preparing goods | 2013-06-12 14:10:00| 
    | 3 | 1 | to_load | loading goods | 2013-06-12 17:00:50| 
    | 4 | 1 | loaded  | finding driver | 2013-06-13 07:00:00| 
    | 5 | 1 | loaded  | ready to deliver| 2013-06-13 08:00:00| 
    | 6 | 1 | on_road | delivering goods| 2013-06-13 09:00:00| 
    | 7 | 1 | in_garage | goods delivered | 2013-06-13 15:00:00| 
    | 8 | 1 | to_load | preparing  | 2013-06-14 08:00:00| 
    | 9 | 1 | to_load | preparing goods | 2013-06-14 14:10:00| 
    | 10 | 1 | to_load | loading goods | 2013-06-14 16:00:50| 
    | 11 | 1 | loaded  | finding driver | 2013-06-12 08:00:00| 
    -------------------------------------------------------------------- 
+0

你能告诉我们算术吗? – Strawberry

+0

你有没有试过'GROUP BY car_status,entry_date'? – Salil

+0

我需要在它改变之前先得到相同'car_status'的最后一行,然后你可以使用'PHP'函数获得时间差异... – DeividasJJ

回答

2

希望这将帮助你

首先,我已经创建car_history表数据:

CREATE TABLE car_history (
    id int(11) NOT NULL AUTO_INCREMENT, 
    car_id int(11) , 
    car_status varchar(45), 
    comments varchar(45), 
    entry_date datetime , 
    PRIMARY KEY (id) 
) ; 


INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (1, '1', 'to_load', 'preparing', '2013-06-12 08:00:00'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (2, '1', 'to_load', ' preparing goods', '2013-06-12 14:10:00'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (3, '1', 'to_load', ' loading goods', '2013-06-12 17:00:50'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (4, '1', 'loaded', ' finding driver', '2013-06-13 07:00:00'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (5, '1', 'loaded', ' ready to deliver', '2013-06-13 08:00:00'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (6, '1', 'on_road', ' delivering goods', '2013-06-13 09:00:00'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (7, '1', 'in_garage', ' goods delivered', '2013-06-13 15:00:00'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (8, '1', 'to_load', ' preparing', '2013-06-14 08:00:00'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (9, '1', 'to_load', ' preparing goods', '2013-06-14 14:10:00'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (10, '1', 'to_load', ' loading goods', '2013-06-14 16:00:50'); 
INSERT INTO car_history (id, car_id,car_status,comments,entry_date) VALUES (11, '1', 'loaded', ' finding driver', '2013-06-12 08:00:00'); 

以后,我执行此查询

select table1.id, table1.car_id, table1.entry_date startDate, 
     table2.entry_date endDate, timediff(table2.entry_date , table1.entry_date) duration 
from 
     (select @i1:[email protected]+1 as rownum, temp.* from (select @i1:=0) as temp_iterator, 
     (SELECT ch1.id, ch1.car_id, ch1.entry_date FROM car_history ch1 left outer join car_history ch2 on ch1.id = ch2.id +1 
       left outer join car_history ch3 on ch1.id = ch3.id -1 
       where ch1.car_status = 'to_load' and 
       (ch1.car_status <> ch2.car_status or ch2.car_status is null 
       or ch1.car_status <> ch3.car_status or ch3.car_status is null) 
       order by ch1.id 
     ) as temp) Table1 , 
     (select @i2:[email protected]+1 as rownum, temp.* from (select @i2:=0) as temp_iterator, 
     (SELECT ch1.id, ch1.car_id, ch1.entry_date FROM car_history ch1 left outer join car_history ch2 on ch1.id = ch2.id +1 
       left outer join car_history ch3 on ch1.id = ch3.id -1 
       where ch1.car_status = 'to_load' and 
       (ch1.car_status <> ch2.car_status or ch2.car_status is null 
       or ch1.car_status <> ch3.car_status or ch3.car_status is null) 
       order by ch1.id 
     ) as temp) Table2 
where table1.rownum = table2.rownum-1 
and mod(table1.rownum,2) = 1 

和最后,我得到了这个结果:

id | car_id | startDate    | endDate    | duration 
1 | 1   | 2013-06-12 08:00:00 | 2013-06-12 17:00:50 | 09:00:50 
8 | 1   | 2013-06-14 08:00:00 | 2013-06-14 16:00:50 | 08:00:50