2009-08-11 12 views

Odpowiedz

87

Chcesz pomnożyć do milisekund, ponieważ część ułamkowa jest odrzucana.

SELECT DATEADD(ms, 121.25 * 1000, 0) 

Jeśli chcesz go bez części datę można wykorzystać konwertowanie stylu 114

SELECT CONVERT(varchar, DATEADD(ms, 121.25 * 1000, 0), 114) 
+2

WYBIERZ KONWERTER (varchar, DATEADD (ms, 121.25 * 1000, 0), 114) jest to. –

+0

Bardzo elegancki. Miły. –

+15

To nie zadziała, jeśli masz więcej niż 24 godziny wartości sekund – JamWheel

3

Korzystanie z SQL Server 05 mogę uzyskać to do pracy za pomocą:

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

to nie działa dla mnie.jeśli zdasz 896434 sekundy - chcesz 10: 09: 00: 34: 000, a nie 249: 00: 34 –

32

Jeśli ilość czas przekracza 24 godzin nie będą obsługiwane prawidłowo z DateAdd i Metody CONVERT.

SELECT CONVERT(varchar, DATEADD(ms, 24*60*60 * 1000, 0), 114) 
00:00:00:000 

Następująca funkcja będzie obsługiwać czasy dłuższe niż 24 godziny (~ maks. 35 791 394 godzin).

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 

Zastosowanie:

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 
+0

Dlaczego czas dłuższy niż 24 godziny nie będzie poprawnie sformatowany przy użyciu narzędzia DateAdd? – gotqn

+3

@gotqn: DateAdd() nie jest problemem. Konwertuj() jest problemem. Convert() skutecznie owija się do zera co 24 godziny. Jeśli użyjesz funkcji Convert() do sformatowania 27-godzinnego interwału, zwróci ona "03:00:00". –

+0

Jak obsłużyć to formatowanie, jeśli przypadek użycia mówi, że wyniki mogą być ujemne gg: mm: ss (np. -340: 23: 34, 03: -4: 05,13: 54: -8 itd.) – Aarush

-1

Konwersja sekund do kilku godzin w wybranych zapytania:

SELECT field_in_seconds,round((field_in_seconds/3600),2) FROM a_table;

To daje wynik w postaci dziesiętnej. Nie wiem, jak przekonwertować od 1.50 do 1:30. Proszę, edytuj mój kod!

0
SELECT substring(convert (varchar(23),Dateadd(s,10000,LEFT(getdate(),11)),121),12,8) 

10000 jest twoja wartość w sekundach

10
DECLARE @seconds AS int = 896434; 
SELECT 
    CONVERT(varchar, (@seconds/86400))    --Days 
    + ':' + 
    CONVERT(varchar, DATEADD(ss, @seconds, 0), 108); --Hours, Minutes, Seconds 

Wyjścia:

10:09:00:34 
+0

To powinno być zaakceptowana odpowiedź - zajmuje się 'sekundą ', tak jak pytał OP, unika stosowania nieefektywnej" funkcji skalarnej "i odpowiednio zajmuje się rozpiętością kilkudniową. Jedyną małą różnicą, którą mógłbym dodać, jest to, że w SQL Agent Land, twoje interwały czasowe/czasowe dla części "dni" zwykle używają "dni.hh: mm: ss", tj. 'Kropka' zamiast' dwukropka '. Na przykład "2.01: 03: 04" przez 2 dni, 1 godzinę, 3 minuty, 4 sekundy. Twoje zdrowie! – NateJ

14

Dla tych mających problemy z korzystaniem DateAdd i konwersja do sekundy przekraczających 24 godziny, możemy użyć modułu, aby uzyskać około:

SELECT CONVERT(varchar, @seconds/86400) + ':' + -- Days 
CONVERT(varchar, DATEADD(ms, (@seconds % 86400) * 1000, 0), 114) 
as "Converted to D:HH:MM:SS.MS" 
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

To właśnie używam (typowo dla raportów e-mail tabeli HTML)

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 
3

Korzystanie z SQL Server 2008

declare @Seconds as int = 3600; 
SELECT CONVERT(time(0), DATEADD(SECOND, @Seconds, 0)) as 'hh:mm:ss' 
+0

daj mi znać powód do zaniechania. – Vijayaraghavan

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

enter image description here

Powiązane problemy