2009-08-11 9 views

Répondre

87

Vous voulez multiplier en millisecondes lorsque la partie fractionnaire est rejetée.

SELECT DATEADD(ms, 121.25 * 1000, 0) 

Si vous voulez sans la partie de date, vous pouvez utiliser convert, avec un style 114

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

SELECT CONVERT (varchar, DATEADD (ms, 121,25 * 1000, 0), 114) est-ce. –

+0

Très élégant. Agréable. –

+15

Cela ne fonctionnera pas si vous avez plus de 24 heures de secondes – JamWheel

3

En utilisant SQL Server 05 je peux obtenir ce travail en utilisant:

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

cela n'a pas fonctionné pour moi.Si vous passez 896434 secondes - vous voulez 10: 09: 00: 34: 000 et non 249: 00: 34 –

32

Si le montant de votre temps dépasse 24 heures il ne sera pas traitée correctement avec le DATEADD et Méthodes CONVERT.

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

La fonction suivante prendra en charge les durées supérieures à 24 heures (~ max 35,791,394 heures).

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 

Utilisation:

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

Pourquoi le temps plus long que 24 heures ne sera pas formaté correctement avec DateAdd? – gotqn

+3

@gotqn: DateAdd() n'est pas le problème. Convert() est le problème. Convert() revient effectivement à zéro toutes les 24 heures. Si vous utilisez Convert() pour formater un intervalle de 27 heures, il renverra "03:00:00". –

+0

Comment gérer ce formatage si le cas d'utilisation dit que les résultats peuvent être négatifs hh: mm: ss (par exemple -340: 23: 34, 03: -4: 05,13: 54: -8 etc.) – Aarush

-1

secondes Convertir les heures requête de sélection:

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

Cela vous donnera le résultat au format décimal. Je ne sais pas comment convertir 1.50 à 1:30. S'il vous plaît, n'hésitez pas à modifier mon code!

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

10000 est votre valeur en sec

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

Sorties:

10:09:00:34 
+0

Cela devrait être le réponse acceptée - elle traite des secondes, comme l'OP l'a demandé, évite d'utiliser une «fonction scalaire» inefficace et traite les intervalles de plusieurs jours de manière appropriée. Le seul point mineur que j'ajouterais est que, dans SQL Land, vos intervalles de temps/temps écoulés pour la partie "days" utilisent généralement "days.hh: mm: ss", c'est-à-dire un point au lieu de "deux points" '. Donc par exemple '2.01: 03: 04' pour 2 jours, 1 heure, 3 minutes, 4 secondes. À votre santé! – NateJ

14

Pour les questions ayant à l'utilisation DATEADD et CONVERT pendant quelques secondes de plus de 24 heures, nous pouvons utiliser le module pour obtenir autour de cela:

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

C'est ce que je l'utilise (généralement pour les rapports de courrier électronique de table 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

En utilisant SQL Server 2008

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

laissez-moi savoir la raison pour downvoting. – 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

Questions connexes