Teilen Sie TIME (0) datatyp nach INT-datatyp und produzieren SUM in separater Spalte

Ich habe einen Tisch TimeLog und Spalten StartTime , FinishTime , Units , ElapsedTime . Ich möchte ElapsedTime nehmen und durch Units teilen, um eine UPH Spalte zu produzieren. So habe ich bis jetzt …

 SELECT StartTime, FinishTime, ElapsedTime = convert(time(0),dateadd(second,datediff(second,StartTime,FinishTime),0)), Units FROM TimeLog StartTime FinishTime ElapsedTime Units 08:00:00 08:25:00 00:25:00 0 08:25:00 09:15:00 00:50:00 0 09:55:00 12:32:00 02:37:00 55 12:32:00 14:31:00 01:59:00 23 12:32:00 13:55:00 01:23:00 55 

Möchte gern die Ergebnisse sehen

 StartTime FinishTime ElapsedTime Units UPH 08:00:00 08:25:00 0:25:00 0 (ElapsedTime/Units) 08:25:00 09:15:00 0:50:00 0 (ElapsedTime/Units) 09:55:00 12:32:00 2:37:00 55 (ElapsedTime/Units) 12:32:00 14:31:00 1:59:00 23 (ElapsedTime/Units) 12:32:00 13:55:00 1:23:00 55 (ElapsedTime/Units) 

Mit NULLIF können Sie die 0 Einheiten auf NULL ändern.
Dividing by NULL gibt NULL, also vermeidet es die Divide by zero error encountered Fehler.

Multiplizieren Sie mit dem Float 1.0, um die INT zu wechseln, die Sie vom Datediff zum Float bekommen.

Und mit ISNULL, um die NULLs auf 0 zu ändern.

Dann casting sie alle auf eine dezimale, die implizit runden es.

 -- Using a table variable for the test declare @TimeLog table (StartTime TIME, FinishTime TIME, Units int); insert into @TimeLog (StartTime, FinishTime, Units) values ('08:00:00','09:00:00',60), ('08:00:00','10:00:00',60), ('08:00:00','08:25:00',0), ('08:25:00','09:15:00',0), ('09:55:00','12:32:00',55), ('12:32:00','14:31:00',23), ('12:32:00','13:55:00',55); SELECT StartTime, FinishTime, ElapsedTime = convert(time,dateadd(second,datediff(second,StartTime,FinishTime),0)), Units, AverageUnitsPerMinute = cast(isnull(Units / nullif(datediff(minute,StartTime,FinishTime)*1.0,0),0.0) as decimal(10,4)), AverageHoursPerUnit = cast(isnull(datediff(second,StartTime,FinishTime)/nullif(Units,0),0)/3600.0 as decimal(10,4)), AverageMinutesPerUnit = cast(isnull(datediff(millisecond,StartTime,FinishTime)/nullif(Units,0),0)/60000.0 as decimal(10,2)) FROM @TimeLog; 

Für die AverageHoursPerUnit:
Dividing the Sekunden um 3600.0 (60 Minuten * 60 Sekunden), um die Stunden zu bekommen.