DRU*_*UID 4 sql sql-server sql-server-2008
我试图从几行中添加时间,当它们加起来超过几个小时时,我没有得到我正在寻找的正确结果。想编写脚本TotalTime
以允许超过 24 个 HH。不必是日期时间数据类型。
StartTime
和FinishTime
是 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)
对于可能超过 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)
另外,您不应该使用字符串文字作为别名,对于不符合常规标识符规则的别名,请将它们括在方括号而不是单引号中。
归档时间: |
|
查看次数: |
10272 次 |
最近记录: |