簡體   English   中英

在SQL中添加的時間總計超過24小時

[英]Adding time that totals more than 24 hrs in SQL

我正在嘗試從幾行中增加時間,當它們加起來超過幾個小時時,我找不到想要的正確結果。 想要編寫TotalTime腳本以允許HH超過24。 不必是日期時間數據類型。

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

結果正確

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM