在 SQL 中添加总计超过 24 小时的时间

DRU*_*UID 4 sql sql-server sql-server-2008

我试图从几行中添加时间,当它们加起来超过几个小时时,我没有得到我正在寻找的正确结果。想编写脚本TotalTime以允许超过 24 个 HH。不必是日期时间数据类型。

StartTimeFinishTime是 varchar(8) 数据类型。

这是代码和输出,其中TotalTime小于 24 小时且正确的结果

SELECT Codes = (DeptCode + '-' +  OpCode)
,TotalTime = convert(time(0),dateadd(second,sum(datediff(second,StartTime,FinishTime)),0)) 
,Units = SUM(Units)
,UPH = cast(isnull(sum(Units) / nullif(sum(datediff(minute,StartTime,FinishTime))*1.0,0),0.0)*60  as decimal(10,0))
,'Goal%' = (convert(varchar,cast((isnull(sum(Units) / nullif(sum(datediff(minute,StartTime,FinishTime))*1.0,0),0.0)*60)/5101*100 as decimal(10,0))) + '%') 
FROM PTW.dbo.TimeLog 
WHERE DeptCode = 'HP' AND OpCode = 'FC'
GROUP BY DeptCode, OpCode
Run Code Online (Sandbox Code Playgroud)

结果正确

Codes   TotalTime   Units   UPH   Goal%
HP-FC   12:37:00    47200   3741    73%
Run Code Online (Sandbox Code Playgroud)

这是实际的分解来证明

ID#     Codes   TotalTime   Units   UPH     Goal%   AssociateName
---     -----   ---------   -----   ---     -----   -------------
2409193 HP-FC   00:21:00    2161    6174    121%    NAME
2507191 HP-FC   00:23:00    2000    5217    102%    NAME
90290   HP-FC   00:20:00    1704    5112    100%    NAME
31676   HP-FC   02:35:00    11234   4349    85%     NAME
2372437 HP-FC   01:50:00    7884    4300    84%     NAME
2378337 HP-FC   07:08:00    22217   3115    61%     NAME
Run Code Online (Sandbox Code Playgroud)

因此,当我在具有更多数据行的较大表上尝试执行此操作时,这就是我得到的结果。输出将显示TotalTime为不正确的时间。

SELECT Codes = (DeptCode + '-' +  OpCode)
,TotalTime = convert(time(0),dateadd(second,sum(datediff(second,StartTime,FinishTime)),0))     
,Units = SUM(Units)
,UPH = cast(isnull(sum(Units) / nullif(sum(datediff(minute,StartTime,FinishTime))*1.0,0),0.0)*60  as decimal(10,0))
,'Goal%' = (convert(varchar,cast((isnull(sum(Units) / nullif(sum(datediff(minute,StartTime,FinishTime))*1.0,0),0.0)*60)/1552*100 as decimal(10,0))) + '%') 
FROM PTW.dbo.TimeLog
WHERE DeptCode = 'HS' AND OpCode = 'HY'
GROUP BY DeptCode, OpCode
Run Code Online (Sandbox Code Playgroud)

查询结果如下。这不可能是真实时间。

Codes   TotalTime   Units   UPH     Goal%
HS-HY   14:07:00    69204   1114    72%
Run Code Online (Sandbox Code Playgroud)

细分显示TotalTime应该超过 14:07:00

ID#     Codes   TotalTime   Units   UPH     Goal%   AssociateName
---     -----   ---------   -----   ---     -----   -------------
2377    HS-HY   11:25:00    20891   1830    118%    NAME
3476    HS-HY   04:50:00    6978    1444    93%     NAME
43864   HS-HY   12:20:00    17628   1429    92%     NAME
2372127 HS-HY   03:20:00    4748    1424    92%     NAME
2372129 HS-HY   07:00:00    9158    1308    84%     NAME
2422946 HS-HY   00:47:00    949     1211    78%     NAME
21437   HS-HY   06:02:00    6530    1082    70%     NAME
2372090 HS-HY   11:00:00    2322    211     14%     NAME
63448   HS-HY   03:43:00    0       0       0%      NAME
2372061 HS-HY   01:40:00    0       0       0%      NAME
Run Code Online (Sandbox Code Playgroud)

Sql*_*Zim 5

对于可能超过 24 小时的间隔,您需要连接一组表达式来计算每个部分,如下所示:

select 
    Codes     = (DeptCode + '-' + OpCode)
  , TotalTime = right('0' + convert(varchar(9),(sum(datediff(second,StartTime,FinishTime)) / 3600 )),2) + ':' 
              + right('0' + convert(varchar(2),(sum(datediff(second,StartTime,FinishTime)) / 60) % 60 ),2) + ':' 
              + right('0' + convert(varchar(2),(sum(datediff(second,StartTime,FinishTime)) % 60 )),2)
  , Units     = sum(Units)
  , UPH       = cast(isnull(sum(Units) / nullif(sum(datediff(minute, StartTime, FinishTime)) * 1.0, 0), 0.0) * 60 as decimal(10, 0))
  , [Goal%]   = (convert(varchar, cast((isnull(sum(Units) / nullif(sum(datediff(minute, StartTime, FinishTime)) * 1.0, 0), 0.0) * 60) / 5101 * 100 as decimal(10, 0))) + '%')
from ptw.dbo.TimeLog
where DeptCode = 'HP'
  and OpCode = 'FC'
group by 
    DeptCode
  , OpCode
Run Code Online (Sandbox Code Playgroud)

另外,您不应该使用字符串文字作为别名,对于不符合常规标识符规则的别名,请将它们括在方括号而不是单引号中。