[英]Adding time that totals more than 24 hrs in SQL
我正在嘗試從幾行中增加時間,當它們加起來超過幾個小時時,我找不到想要的正確結果。 想要編寫TotalTime
腳本以允許HH超過24。 不必是日期時間數據類型。
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
結果正確
Codes TotalTime Units UPH Goal%
HP-FC 12:37:00 47200 3741 73%
這是實際的故障證明
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
因此,當我在具有更多數據行的較大表上嘗試此操作時,這就是我得到的。 輸出將顯示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
查詢結果如下。 這不是真實的時間。
Codes TotalTime Units UPH Goal%
HS-HY 14:07:00 69204 1114 72%
細目分類,向您顯示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
對於可能超過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
同樣,您不應該將字符串文字用作別名,對於不符合常規標識符規則的別名,請使用方括號而不是單引號引起來。
我認為您的問題是時間數據類型不足以容納大於24小時的值。
您將需要創建其他類型的變量,以准確地跟蹤小時,分鍾,秒等。
https://docs.microsoft.com/en-us/sql/t-sql/data-types/time-transact-sql
那是因為您要將總和轉換為time
數據類型,這意味着“日期時間的時間部分”。 這樣一來,總數就永遠不會超過24,因為即使在軍事時期,也不會有25點這樣的東西。
為了獲得正確的總數,一種方法是構建一個varchar
數據類型而不是time
類型。 您將需要花費幾秒鍾的時間並分別除以60和60 * 60來生成分鍾和小時部分,從而構造varchar字符串。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.