2009-05-29 5 views
7

ho la seguente tabella di tipi di dati TEMPOottenere la somma dei tipi di dati TEMPO (MSSQL08) da una tabella

precisazione: io rappresento ore/minuti/secondi di video e voglio capire quanto tempo i video saranno .

runtime 
---------------- 
01:27:19.0000000 
01:26:09.0000000 
01:00:56.0000000 
01:09:59.0000000 
01:25:43.0000000 
01:16:01.0000000 
01:27:12.0000000 
01:22:00.0000000 
01:17:47.0000000 
01:31:07.0000000 
01:36:23.0000000 
01:13:29.0000000 
01:20:12.0000000 
01:03:24.0000000 
00:58:42.0000000 

Voglio ottenere la somma di tutti questi tempi.

+0

Per quale scopo? Non ha senso – dkretz

+3

Non penso che sia privo di significato ... forse questi sono i tempi delle canzoni di un album, e lui vuole la durata totale dell'intero album? Una sola possibilità ... – JosephStyons

+0

Joseph ha ragione su ... Voglio ottenere la durata della serie di video "Summer of NHibernate" in modo che quando raccomando questa serie ad altri, posso dire loro esattamente per quanto tempo i video porteranno Vai oltre. –

risposta

6

Non ho ancora molto utilizzati 2008 e non ho un caso pratico in cui mi trovo a controllare questo, ma qualcosa di simile potrebbe funzionare:

SELECT 
    DATEADD(ms, SUM(DATEDIFF(ms, '00:00:00.000', my_time)), '00:00:00.000') 
FROM 
    dbo.My_Table 

Come le dorfier sottolinea, aggiungendo volte è un po 'priva di significato, perché dovrebbero rappresentare un momento della giornata. Sto andando sotto il presupposto che li stai usando per indicare ore/minuti/secondi.

Oh, e non ho idea di cosa accadrà con quanto sopra se va oltre 24 ore.

+0

Ha funzionato come un fascino ... Il risultato è stato '1900-01-01 19: 36: 23.000' quindi credo che se il la risposta è stata più di 24 ore sarà solo andare al giorno successivo. –

0

Il modo migliore che riesco a pensare è quello di analizzare l'intervallo di tempo in componenti di ore, minuti, secondi e millisecondi, convertirlo in millisecondi (aggiungendo e moltiplicando), quindi aggiungendoli e utilizzando i moduli e la sottrazione per trasformarlo di nuovo in un intervallo di tempo.

Per esempio

create function dbo.GetMilliseconds (@timespan varchar (16)) 
    returns int 
as 
begin 
declare @ms int 
declare @seconds int 
declare @min int 
declare @hour int 
set @ms = cast(substring(@timespan, 10, 7) as int) 
set @seconds = cast(substring(@timespan, 7, 2) as int) 
set @min = cast(substring(@timespan, 4,2) as int) 
set @hour = cast(substring(@timespan, 1, 2) as int) 
return @ms + (@seconds * 1000) + (@min * 60000) + (@hour * 3600000) 
end 
go 

create function dbo.ParseMilliseconds (@timespan int) 
    returns varchar (16) 
as 
begin 
declare @hour int 
declare @min int 
declare @seconds int 
declare @ms int 
declare @leftover int 
set @hour = @timespan/3600000 /* this will round down */ 
set @leftover = @timespan % 3600000 
set @min = @leftover/60000 
set @leftover = @leftover % 60000 
set @seconds = @leftover/1000 
set @ms = @leftover % 1000 
return 'You''ll have to the string conversion yourself' 
end 
go 

E poi SELECT dbo.ParseMilliseconds(sum(dbo.GetMilliseconds(timespan))) as added_timespan

non ho provato tutto questo, e ci possono essere modi più semplici, ma so che questo funzionerà.

0

qualche variazione di

SELECT SUM (DATEDIFF (MINUTO, '0:00:00', TimeCol)) dall'orario

funzionerà ma

si dovrà normalizzare sottraendo la data parte da ogni datetime e dovrai convertire i minuti totali in un tempo

Problemi correlati