0
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 开始,然后新的 SO # 107321 由员工 4878 于 4 月 26 日 22:19 开始。我需要计算 4/ 26/2013 22:19 和 4/26/2013 15:29。这将为我提供 SO# 9999 的下班日期,但实际上需要辅助流程。现在我只需要能够得到时间。一个问题是如果 SO # 相同,那么我只会使用第一个 StartDateTime,以及下一个 SO # 的第一个 StartDateTime。对不起,这太长了,我什至不确定我是否已经解释过任何事情。

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

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

在周末仔细考虑之后,我决定最好使用 EndDateTime,因为这个查询只是整个应用程序/报告的第一步。

此外,EmployeeNum 不再与应用程序的这一部分相关。

这就是它的样子(EquipmentUseID 是 PK,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。希望这能解决这个问题,很抱歉造成混乱。

4

3 回答 3

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 
于 2013-08-17T00:08:37.370 回答
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;

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

于 2013-08-16T22:30:31.127 回答
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 
于 2013-08-16T22:58:12.030 回答