代码之家  ›  专栏  ›  技术社区  ›  Veljko

SQL查询-ALN字段中的总持续时间值(hh:mm:ss)

  •  0
  • Veljko  · 技术社区  · 7 年前

    我有带ID的T1表:

    ID
    1
    2
    

    我有带有ID和GROUP\U跟踪时间的表T2,因为记录可以在特定组多次出现。GROUP\u跟踪时间为ALN类型(字符串),无法更改,但它始终包含hh:mm:ss中的持续时间值,其中hh列始终至少有2个字符,但如果记录已经是某个组很长一段时间,它当然可以包含更多字符:

    ID  GROUP   GROUP_TRACKING
    1   GROUP1  05:55:05
    1   GROUP1  10:10:00
    1   GROUP2  111:51:00
    1   GROUP2  01:01:00
    

    所以我需要 选择 条款来自 T1级 表和连接T2表来跟踪每个组(G1和G2)在该特定组上花费的时间。

    所以最终结果应该是这样的:

    ID  GROUP1    GROUP2
    1   16:05:05  112:52:00
    2   null      null
    

    如何计算这些持续时间(小时和分钟)的选择和?

    非常感谢。

    1 回复  |  直到 7 年前
        1
  •  1
  •   MichaelTiefenbacher    7 年前

    这里有一个没有枢轴步骤的解决方案(可以在许多其他anser中查找)

    with temp as (
    select id
          , group
          , group_tracking
          , SUBSTR(group_tracking, 1,LOCATE(':',group_tracking)-1) * 3600 as First_PART_in_s
          , SUBSTR(group_tracking, LOCATE(':',group_tracking)+1,2) * 60 as Second_PART_in_s
          , SUBSTR(group_tracking, LOCATE(':',group_tracking, LOCATE(':',group_tracking)+1)+1, 2) as Third_PART_in_s
      from t2
    )
    select t1.id
          , t.group
          , int(sum(First_PART_in_s + Second_PART_in_s + Third_PART_in_s) / 360000) ||  replace(char(time('00:00:00') + mod(sum(First_PART_in_s + Second_PART_in_s + Third_PART_in_s),360000) seconds,ISO),'.',':') as duration
      from t1
      left join temp t
        on t1.id = t.id
      group by t1.id, group
    

    我完全同意@Clockwork Muse的观点,即格式很重要,而使用这种不适当的格式会在重新格式化、解构和重新构建事物方面付出大量额外的努力。