So konvertieren Sie Sekunden mit T-SQL in HH: MM: SS

Antworten:

139

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)
great_llama
quelle
3
SELECT CONVERT (varchar, DATEADD (ms, 121,25 * 1000, 0), 114) ist es.
Brett Veenstra
19
Dies funktioniert nicht, wenn Sie mehr als 24 Stunden Sekunden haben
JamWheel
21
Sehr gepflegt. Verwenden Sie 108, wenn Sie keine Millisekunden möchten, dh hh: mi: ss
stuartd
8
Wenn Sie SQL 2008+ haben und nur den Zeitanteil möchten; anstatt in varchar zu konvertieren: SELECT CONVERT (Zeit, DATEADD (ms, 121,25 * 1000, 0))
Eric Humphrey
44

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
jim31415
quelle
Warum wird die Zeit, die länger als 24 Stunden ist, mit DateAdd nicht richtig formatiert?
Gotqn
4
@gotqn: DateAdd () ist nicht das Problem. Convert () ist das Problem. Convert () wird effektiv alle 24 Stunden auf Null gesetzt. Wenn Sie mit Convert () ein 27-Stunden-Intervall formatieren, wird "03:00:00" zurückgegeben.
Mike Sherrill 'Cat Recall'
Wie man mit dieser Formatierung umgeht, wenn der Anwendungsfall besagt, dass die Ergebnisse negativ sein können hh: mm: ss (z. B. -340: 23: 34, 03: -4: 05,13: 54: -8 usw.)
OmGanesh
Dies ist der richtige Weg. Keine der anderen Lösungen hier funktioniert ordnungsgemäß für die HHMMSS-Formatierung über 24 Stunden hinaus. Dies hilft auch dabei, Ihre Fragen ordentlich zu halten.
Krummelz
27

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"
BrettC
quelle
20
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
cmd.prompt
quelle
1
Dies sollte die akzeptierte Antwort sein - sie behandelt seconds, wie das OP verlangt, vermeidet die Verwendung einer ineffizienten scalar functionund 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 dotanstelle von colon. Zum Beispiel 2.01:03:04für 2 Tage, 1 Stunde, 3 Minuten, 4 Sekunden. Prost!
NateJ
10

Verwenden von SQL Server 2008

declare @Seconds as int = 3600;
SELECT CONVERT(time(0), DATEADD(SECOND, @Seconds, 0)) as 'hh:mm:ss'
Pranesh Janarthanan
quelle
2
Lassen Sie mich den Grund für die Ablehnung wissen.
Pranesh Janarthanan
4

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')
Richard Reddy
quelle
Das hat bei mir nicht funktioniert. Wenn Sie 896434 Sekunden vergehen - möchten Sie 10: 09: 00: 34: 000 und nicht 249: 00: 34
Marcello Miorelli
1
SELECT substring(convert (varchar(23),Dateadd(s,10000,LEFT(getdate(),11)),121),12,8)

10000 ist Ihr Wert in Sek

Yacob
quelle
1
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)
albin.varghese
quelle
1

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
AbelianCommuter
quelle
0
DECLARE @Seconds INT = 86200;
SELECT 
CONVERT(VARCHAR(15), 
CAST(CONVERT(VARCHAR(12), @Seconds / 60 / 60 % 24)
+':'+ CONVERT(VARCHAR(2), @Seconds / 60 % 60)
+':'+ CONVERT(VARCHAR(2), @Seconds % 60) AS TIME), 100) AS [HH:MM:SS (AM/PM)]

Geben Sie hier die Bildbeschreibung ein

Rajiv Singh
quelle
0

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
anas bouhajbi
quelle