【问题标题】:Calculating differences in time from multiple rows计算多行的时间差异
【发布时间】:2013-08-16 22:20:50
【问题描述】:
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#StartDateTime per SO#(已经在表中), 和 EndDateTime 这实际上是下一个 SO# 的 StartDateTime。希望这可以清除 搞定了,抱歉给您造成困扰。

【问题讨论】:

  • 使用内联视图,首先获取每个车间订单的最大日期,然后查找 LAG 函数并遍历那些进行时间差异的函数
  • @randy SQL 2005 没有滞后
  • @ctmcklowe96 你能为给定的输入提供所需的输出吗?
  • @RomanPekar - 输出和更多解释以粗体的“已编辑输出...”开头。

标签: sql tsql sql-server-2005 datediff


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

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

    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;
    

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

    【讨论】:

      【解决方案3】:

      使用 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 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-04-02
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多