【问题标题】:How to calculate resolution time in MySQL?如何在 MySQL 中计算解析时间?
【发布时间】:2016-11-28 16:01:57
【问题描述】:

我有以下形式的数据:

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-07-22 09:46:40 - 2016-07-21 11:46:40) + (2016-07-25 11:46:40 - 2016-07-23 08:42:40 ))/2.

【问题讨论】:

  • 我不认为你的计算是正确的。第一个值为“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

标签: mysql sql reporting analytics aggregation


【解决方案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

【讨论】:

  • 也检查一下我的答案!
【解决方案2】:

这对我来说似乎没问题。

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';

【讨论】:

  • 不保证在单独的表达式中分配变量有效。 MySQL 不保证SELECT 中表达式的求值顺序,因此四个赋值可以是任意顺序。
  • 没有办法在 MySQL 中进行领先/滞后? @GordonLinoff
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 2016-06-22
  • 2011-09-24
  • 2021-12-05
相关资源
最近更新 更多