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:
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!
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)
quelle
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
quelle
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"
quelle
DECLARE @seconds AS int = 896434; SELECT CONVERT(varchar, (@seconds / 86400)) --Days + ':' + CONVERT(varchar, DATEADD(ss, @seconds, 0), 108); --Hours, Minutes, Seconds
Ausgänge:
quelle
second
s, wie das OP verlangt, vermeidet die Verwendung einer ineffizientenscalar 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 adot
anstelle voncolon
. Zum Beispiel2.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'
quelle
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')
quelle
SELECT substring(convert (varchar(23),Dateadd(s,10000,LEFT(getdate(),11)),121),12,8)
10000 ist Ihr Wert in Sek
quelle
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)
quelle
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
quelle
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)]
quelle
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
quelle