计算多行的时间差异

时间:2013-08-16 22:20:51

标签: sql tsql sql-server-2005 datediff

EquipmentUseId  CollectionPointId  EmployeeNum  ShopOrder  StartDateTime
366                 69             9999         999999     4/26/13 3:29 PM
373                 69             4878         107321     4/26/13 10:19 PM
385                 69             4971         107321     4/27/13 7:35 AM
393                 69             4179         107325     4/30/13 7:24 AM
394                 69             4179         107325     4/30/13 7:38 AM
395                 69             4179         107325     4/30/13 10:28 AM
398                 69             4179         107325     4/30/13 2:41 PM
399                 69             9999         999999     4/30/13 2:43 PM
400                 69             9999         999999     4/30/13 2:46 PM

鉴于上表,我留下了一个独特的问题并描述它可能同样困难。每个员工的每个ShopOrder都有一个StartDateTime,但没有StopDateTime,这是设计的。但是我需要能够计算一个ShopOrder的StartDateTime和下一个ShopOrder的StartDateTime之间的时间差。例如:SO#999999于4月26日15:29由员工9999开始,然后新员工#107321于4月26日22:19由员工4878启动。我需要计算4 /之间的差异26/2013 22:19和4/26/2013 15:29。这将给我SO#9999的时钟输出日期,但它实际上需要一个辅助过程。现在我只需要能够得到时间。一个问题是,如果SO#是相同的,那么我只会使用第一个StartDateTime,以及下一个SO#的第一个StartDateTime。对不起,这太久了,我甚至不确定此时我是否已解释过任何问题。

请放轻松我...这是漫长的一天。

  

在2013年8月19日编辑输出:

     

在周末考虑之后,我认为这是最好的   使用EndDateTime作为此查询只是第一步   整体申请/报告。

     

此外,EmployeeNum不再与该部分申请相关。

     

这应该是它的样子(EquipmentUseID是PK,the   CollectionPointID总是69,所以它们不需要显示在   输出)?

ShopOrder    StartDateTime        EndDateTime
999999       4/26/13 3:29 PM      4/26/13 10:19 PM
107321       4/26/13 10:19 PM     4/30/13 7:24 AM
107325       4/30/13 7:24 AM      4/30/13 2:43 PM
999999       4/30/13 2:43 PM      <next SO# StartDateTime>
     

总结一下这个表格,我需要 SO#每个SO#的StartDateTime (已经在表格中),   以及 EndDateTime ,它实际上是下一个SO#的StartDateTime。希望这清除   它,抱歉混淆。

3 个答案:

答案 0 :(得分:0)

这是第一个问题的解决方案,即在“下一个”车间订单上获取下一个日期时间。此解决方案使用相关子查询:

select t.*, nextStartDateTime - StartDateTime -- or use datediff() here if you want the time in particular units
from (select t.*,
             (select top 1 StartDateTime
              from t t2
              where t2.StartDateTime > t.StartDateTime and
                    t2.ShopOrder <> t.ShopOrder
              order by StartDateTime
             ) as nextStartDateTime
      from t
     ) t;

第二个问题是获得给定车间订单的第一条记录。我不确定我完全明白这一点。如果您编辑问题以解释问题中提供的数据所需的结果,将会有所帮助。

答案 1 :(得分:0)

with orderedTickets as 
(
    select ShopOrder, min(StartDateTime) as date 
         , row_number() over (order by min(StartDateTime)) as rownumber
    from table 
    where ShopOrder is not null  
    group by ShopOrder
)
select t1.ShopOrder, datediff(ss, t1.StartDateTime, t2.StartDateTime) 
  from orderedTickets as t1 
  join orderedTickets as t2 
    on t2.rownumber = t1.rownumber + 1 

答案 2 :(得分:0)

使用CTE, -

;with Equipment as 
(
select EquipmentUseId, CollectionPointId, EmployeeNum, ShopOrder, StartDateTime, row_number() over (PARTITION BY ShopOrder order by EquipmentUseId) as rownumber
from your_table 
),
Equipment2 AS (
select EquipmentUseId, CollectionPointId, EmployeeNum, ShopOrder, StartDateTime, row_number() over (order by EquipmentUseId) as rownumber
from Equipment WHERE rownumber = 1
)

SELECT t1.EquipmentUseId,
   t1.CollectionPointId,
   t1.EmployeeNum,
   t1.ShopOrder,
   t1.StartDateTime,
   CONVERT(VARCHAR, DATEDIFF(n, t1.StartDateTime, t2.StartDateTime) / 60) + ':' +  RIGHT('0' + CONVERT(VARCHAR,(DATEDIFF(n, t1.StartDateTime, t2.StartDateTime)%60)), 2) time_diff
FROM   Equipment2 AS t1
LEFT JOIN Equipment2 AS t2 ON  t2.rownumber = t1.rownumber + 1