Hinzufügen von time, die mehr als 24 Stunden in SQL

Ich versuche, time aus mehreren Reihen hinzuzufügen, und wenn sie sich mehr als Stunden hinzufügen, bekomme ich keine korrekten Ergebnisse, die ich suche. Möchte gern TotalTime , um mehr als 24 in HH zu erlauben. Muss kein Datetime-datatyp sein.

StartTime und FinishTime sind Varchar (8) datatypen.

hier ist Code und Ausgabe, wo TotalTime weniger als 24 Stunden und korrekte Ergebnisse ist

 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 

Ergebnisse sind korrekt

 Codes TotalTime Units UPH Goal% HP-FC 12:37:00 47200 3741 73% 

Hier ist der tatsächliche Zusammenbruch zu beweisen

 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 

Also, wenn ich das auf einem größeren Tisch mit mehr Zeilen von data versuche, ist das, was ich bekomme. Out put zeigt TotalTime als falsche time an.

 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 

Ergebnisse aus der Abfrage sind unten. Das kann keine wahre time sein.

 Codes TotalTime Units UPH Goal% HS-HY 14:07:00 69204 1114 72% 

Breakdown, um Ihnen zu zeigen, dass TotalTime mehr als 14:07:00 sein sollte

 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 

Für Intervalle, die 24 Stunden überschreiten können, müssen Sie einen Satz von Ausdrücken verketten, die jedes Stück wie folgt berechnen:

 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 

Außerdem sollten Sie keine String-Literale für Aliase verwenden, für Aliase, die nicht mit den Regeln für reguläre Identifikatoren übereinstimmen, sie in eckige Klammern anstelle von einfachen Anführungszeichen einschließen.

  • databasekennungen – docs

Ich denke dein Problem ist, dass der time-datatyp nicht groß genug ist, um Werte größer als 24 Stunden zu halten.

Sie müssen andere Arten von variables erstellen, um Stunden, Minuten, Sekunden usw. zu verfolgen – so genau wie Sie es brauchen.

https://docs.microsoft.com/en-us/sql/t-sql/data-types/time-transact-sql

Das ist, weil Sie die Summe zu einem time datatyp umwandeln, was bedeutet "der timeteil einer datetime". Das wird also nicht mehr als 24 zeigen, denn auch in militärischer time gibt es noch keine Uhr mehr als 25 Uhr.

Um Ihre korrekte Summe zu erhalten, ist eine Möglichkeit, einen varchar datatyp anstelle eines varchar zu erstellen. Sie müssen den Varchar-String konstruieren, indem Sie Ihre Sekunden nehmen und sich um 60 und 60 * 60 teilen, um die Minuten- und Stundenabschnitte zu erzeugen.