Die Situation ist, dass Sie einen Wert in Sekunden (XXX.XX) haben und mit T-SQL in HH: MM: SS konvertieren möchten.
Beispiel:
- Aus 121,25 s wird 00: 02: 01,25
Die Situation ist, dass Sie einen Wert in Sekunden (XXX.XX) haben und mit T-SQL in HH: MM: SS konvertieren möchten.
Beispiel:
Antworten:
Sie möchten auf Millisekunden multiplizieren, wenn der Bruchteil verworfen wird.
SELECT DATEADD(ms, 121.25 * 1000, 0)
Wenn Sie es ohne den Datumsbereich möchten, können Sie CONVERT mit Stil 114 verwenden
SELECT CONVERT(varchar, DATEADD(ms, 121.25 * 1000, 0), 114)
Wenn Ihre Zeitspanne 24 Stunden überschreitet , wird sie mit den Methoden DATEADD und CONVERT nicht korrekt behandelt.
SELECT CONVERT(varchar, DATEADD(ms, 24*60*60 * 1000, 0), 114)
00:00:00:000
Die folgende Funktion verarbeitet Zeiten von mehr als 24 Stunden (~ max. 35.791.394 Stunden).
create function [dbo].[ConvertTimeToHHMMSS]
(
@time decimal(28,3),
@unit varchar(20)
)
returns varchar(20)
as
begin
declare @seconds decimal(18,3), @minutes int, @hours int;
if(@unit = 'hour' or @unit = 'hh' )
set @seconds = @time * 60 * 60;
else if(@unit = 'minute' or @unit = 'mi' or @unit = 'n')
set @seconds = @time * 60;
else if(@unit = 'second' or @unit = 'ss' or @unit = 's')
set @seconds = @time;
else set @seconds = 0; -- unknown time units
set @hours = convert(int, @seconds /60 / 60);
set @minutes = convert(int, (@seconds / 60) - (@hours * 60 ));
set @seconds = @seconds % 60;
return
convert(varchar(9), convert(int, @hours)) + ':' +
right('00' + convert(varchar(2), convert(int, @minutes)), 2) + ':' +
right('00' + convert(varchar(6), @seconds), 6)
end
Verwendung:
select dbo.ConvertTimeToHHMMSS(123, 's')
select dbo.ConvertTimeToHHMMSS(96.999, 'mi')
select dbo.ConvertTimeToHHMMSS(35791394.999, 'hh')
0:02:03.000
1:36:59.940
35791394:59:56.400
Für diejenigen, die Probleme mit der Verwendung von DATEADD und CONVERT für Sekunden über 24 Stunden haben, können wir den Modul verwenden, um dies zu umgehen:
SELECT CONVERT(varchar, @seconds / 86400 ) + ':' + -- Days
CONVERT(varchar, DATEADD(ms, ( @seconds % 86400 ) * 1000, 0), 114)
as "Converted to D:HH:MM:SS.MS"
DECLARE @seconds AS int = 896434;
SELECT
CONVERT(varchar, (@seconds / 86400)) --Days
+ ':' +
CONVERT(varchar, DATEADD(ss, @seconds, 0), 108); --Hours, Minutes, Seconds
Ausgänge:
10:09:00:34
second
s, wie das OP verlangt, vermeidet die Verwendung einer ineffizienten scalar function
und behandelt mehrtägige Zeitspannen angemessen. Der einzige kleine Fehler, den ich hinzufügen möchte, ist, dass in SQL Agent-Land Ihre verstrichenen Zeit- / Zeitintervalle für den Teil "Tage" normalerweise "Tage.hh: mm: ss" verwenden, dh a dot
anstelle von colon
. Zum Beispiel 2.01:03:04
für 2 Tage, 1 Stunde, 3 Minuten, 4 Sekunden. Prost!
Verwenden von SQL Server 2008
declare @Seconds as int = 3600;
SELECT CONVERT(time(0), DATEADD(SECOND, @Seconds, 0)) as 'hh:mm:ss'
Mit SQL Server 05 kann ich dies zum Laufen bringen, indem ich Folgendes verwende:
declare @OrigValue int;
set @OrigValue = 121.25;
select replace(str(@OrigValue/3600,len(ltrim(@OrigValue/3600))+abs(sign(@OrigValue/359999)-1)) + ':' + str((@OrigValue/60)%60,2) + ':' + str(@OrigValue%60,2),' ','0')
DECLARE @TimeinSecond INT
SET @TimeinSecond = 340 -- Change the seconds
SELECT RIGHT('0' + CAST(@TimeinSecond / 3600 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST((@TimeinSecond / 60) % 60 AS VARCHAR),2) + ':' +
RIGHT('0' + CAST(@TimeinSecond % 60 AS VARCHAR),2)
Dies ist, was ich verwende (normalerweise für HTML-Tabellen-E-Mail-Berichte)
declare @time int, @hms varchar(20)
set @time = 12345
set @hms = cast(cast((@Time)/3600 as int) as varchar(3))
+':'+ right('0'+ cast(cast(((@Time)%3600)/60 as int) as varchar(2)),2)
+':'+ right('0'+ cast(((@Time)%3600)%60 as varchar(2)),2) +' (hh:mm:ss)'
select @hms
Sie können dies versuchen
set @duration= 112000
SELECT
"Time" = cast (@duration/3600 as varchar(3)) +'H'
+ Case
when ((@duration%3600 )/60)<10 then
'0'+ cast ((@duration%3600 )/60)as varchar(3))
else
cast ((@duration/60) as varchar(3))
End