2009-05-29 10 views
7

mam poniższej tabeli typów danych CZASGet suma typów danych czasu (MSSQL08) z tabeli

wyjaśnienie: Jestem reprezentujących godziny/min/sekundy filmy i chcesz dowiedzieć się, jak długo wideo będzie .

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 

Chcę uzyskać Suma wszystkich tych czasów.

+0

W jakim celu? To nic nie znaczy. – dkretz

+3

Nie sądzę, że to nic nie znaczy ... może są to czasy piosenek na albumie, a on chce cały czas trwania całego albumu? Tylko jedna możliwość ... – JosephStyons

+0

Joseph jest tuż ... Chcę uzyskać czas trwania serii filmów "Summer of NHibernate", więc kiedy polecam tę serię innym, mogę powiedzieć im dokładnie, jak długo filmy będą trwać iść przez. –

Odpowiedz

6

Nie używałem 2008 znacznie jeszcze i nie mam instancję poręczny, gdzie Ja jestem, aby to sprawdzić, ale coś takiego może działać:

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

Jak le dorfier zaznacza, dodając razy jest trochę bez znaczenia, ponieważ mają one przedstawiać porę dnia. Zakładam, że używasz ich do wskazania godzin/minut/sekund.

Aha, i nie mam pojęcia, co stanie się z powyższymi, jeśli przekroczy 24 godziny.

+0

Pracował jak urok ... Rezultatem było "1900-01-01 19: 36: 23.000", więc wierzę, że jeśli odpowiedź była dłuższa niż 24 godziny, po prostu przejdzie do następnego dnia. –

0

Najlepszym sposobem, jaki mogę sobie wyobrazić, jest przeanalizowanie przedziałów czasu na komponenty godzin, minut, sekund i milisekund, przekształcenie wszystkiego na milisekundy (przez dodanie i pomnożenie), następnie dodanie ich i użycie modulos i odejmowanie w celu jego zmiany z powrotem do przedziału czasowego.

Na przykład

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 

A potem SELECT dbo.ParseMilliseconds(sum(dbo.GetMilliseconds(timespan))) as added_timespan

Nie testowałem tego wszystkiego, i nie może być prostsze sposoby, ale wiem, że to będzie działać.

0

pewne zróżnicowanie

SELECT SUM (DateDiff (minuta, '00:00:00', TimeCol)) FROM harmonogram

zadziała ale

będzie trzeba znormalizować przez odjęcie data część z każdej datetime i będziesz musiał przekonwertować wszystkie minuty do czasu