如何计算记录之间的时间在SQL Server 2008(How to calculate time

2019-09-23 10:46发布

在2008年SQL审计表,我需要计算每个时间顺序是在一个给定的步骤(表示为新的列)。

 Old      New           Time Entered        Order Number
 NULL     Step 1        4/30/12 10:43       1C2014A
 Step 1   Step 2        5/2/12 10:17        1C2014A
 Step 2   Step 3        5/2/12 10:28        1C2014A
 Step 3   Step 4        5/2/12 11:14        1C2014A
 Step 4   Step 5        5/2/12 11:19        1C2014A
 Step 5   Step 9        5/3/12 11:23        1C2014A
 NULL     Step 1        5/18/12 15:49       1C2014B
 Step 1   Step 2        5/21/12 9:21        1C2014B
 Step 2   Step 3        5/21/12 9:34        1C2014B
 Step 3   Step 4        5/21/12 10:08       1C2014B
 Step 4   Step 5        5/21/12 10:09       1C2014B
 Step 5   Step 6        5/21/12 16:27       1C2014B
 Step 6   Step 9        5/21/12 18:07       1C2014B
 NULL     Step 1        6/12/12 10:28       1C2014C
 Step 1   Step 2        6/13/12 8:36        1C2014C
 Step 2   Step 3        6/13/12 9:05        1C2014C
 Step 3   Step 4        6/13/12 10:28       1C2014C
 Step 4   Step 6        6/13/12 10:50       1C2014C
 Step 6   Step 8        6/13/12 12:14       1C2014C
 Step 8   Step 4        6/13/12 15:13       1C2014C
 Step 4   Step 5        6/13/12 15:23       1C2014C
 Step 5   Step 8        6/13/12 15:30       1C2014C
 Step 8   Step 9        6/18/12 14:04       1C2014C
  • 步骤并不是连续的需要,所以步骤1可以在步骤5之后发生。
  • 对于订单的记录不会被保存一步或订单顺序,而是与基于输入的时间等订单混合。 样本数据由订单编号排序,然后新的不正常,不能被他们依赖的。
  • 每个步骤可以重复任何给定的顺序,如果重复的顺序,然后通过步骤求和倍。
  • 开始步骤记录总是在旧列空
  • 启动步骤的计算方法时,它是在新柱之间的时间差,当它是在一个给定的顺序古列的值。

输出可以是简单的:

Order Number   Step      Time in Step
1C2014A        Step 1    6:09

Answer 1:

这是我想出了:

select 
  a1.OrderNumber,
  a1.New as Step, 
  datediff(second, a1.TimeEntered, isnull(a2.timeEntered,getdate()))
    as [Time in Step (seconds)]
from AuditTrail a1
left join AuditTrail a2
  on a1.New = a2.Old 
  and a1.OrderNumber = a2.OrderNumber

对于订单再也没有出来的步骤,时间计算到当前时刻( getdate()

在线工作样本: http://www.sqlfiddle.com/#!3/fbaff/11

更新:

上面的查询可以显示一个步骤多次(例如:为了1C2014C 4多次通过步骤)。

要通过订单/步长集团,并显示每对的总时间,使用SQL语句来代替:

select
  a1.OrderNumber,
  a1.New as Step, 
  sum(datediff(second, a1.TimeEntered, isnull(a2.timeEntered,getdate())))
    as [Total Time in Step (seconds)]
from AuditTrail a1
left join AuditTrail a2
  on a1.New = a2.Old 
  and a1.OrderNumber = a2.OrderNumber
group by a1.OrderNumber, a1.New
order by a1.OrderNumber

在线工作样本: http://www.sqlfiddle.com/#!3/fbaff/14



文章来源: How to calculate time between records in SQL Server 2008