2016-07-25 26 views
0

我在下面的表格數據:如何計算MySQL中的解析時間?

TicketID Status Datetime 
25   Open  2016-07-21 11:46:40 
25   Open  2016-07-22 09:42:40 
25   Closed 2016-07-22 09:46:40 
25   Open  2016-07-23 08:42:40 
25   Open  2016-07-24 08:46:40 
25   Open  2016-07-24 09:26:40 
25   Closed 2016-07-25 11:46:40 

我想計算如下:

((2016年7月22日9時46分四十秒 - 2016年7月21日11:46: 40)+(2016-07-25 11:46:40 - 2016-07-23 08:42:40))/ 2。

+0

我不認爲你的計算是正確的。第一個值是「0」。 –

+0

您是否試圖計算每張票的平均完成時間?每張票可以在同一個ID下多次打開和關閉。正如@GordonLinoff所說,你的計算似乎是錯誤的(可能只是一個錯字)。我想它應該是:'((''2016-06-22 09:46:40' - '2016-06-21 11:46:40')+('2016-07-25 11:46:40' - '2016-06-23 08:42:40'))/ 2' –

回答

1

這是一個想法:對於每個「打開」獲得下一個「關閉」。然後只選擇「關閉」的值,並將最小值打開以確定時間長度。所以,下面得到你想要的時間對:

select close_datetime, min(datetime) as open_datetime 
from (select t.*, 
      (select t2.DateTime 
       from t t2 
       where t2.status = 'Closed' and t2.DateTime > t.DateTime 
      ) as close_datetime 
     from t 
     where status = 'Open' 
    ) t 
group by close_datetime; 

然後你可以得到差異的總和。這得到的值在幾秒鐘內:

select sum(timestampdiff(second, clsoe_datetime, open_datetime) as num_seconds 
from (select close_datetime, min(datetime) as open_datetime 
     from (select t.*, 
        (select t2.DateTime 
        from t t2 
        where t2.status = 'Closed' and t2.DateTime > t.DateTime 
        ) as close_datetime 
      from t 
      where status = 'Open' 
      ) t 
     group by close_datetime 
    ) t 
+0

查看我的回答呢! – MontyPython

0

這似乎對我好。

set @x=now(), @y=-1; 

select 
    avg(timestampdiff(second,prev_stat_dt,curr_stat_dt)) 
from 
    (select 
     TicketID, 
      @y prev_stat, 
      @y:=Status curr_stat, 
      @x prev_stat_dt, 
      @x:=DateTime curr_stat_dt 
    from 
     table1 
    where 
      Status in ('Open' , 'Closed')) t 
where 
    prev_stat = 'Open' and curr_stat = 'Closed'; 
+0

不能保證在單獨的表達式中分配變量。 MySQL不保證在SELECT中表達式的評估順序,因此這四個任務可以按任意順序進行。 –

+0

在MySQL中沒有辦法做到超前/滯後? @GordonLinoff – MontyPython

+0

是的,但它對變量有點棘手。 –