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)

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

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"

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

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'

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')

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


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)

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

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


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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.