2009-05-29 22 views
7

我有時間數據類型如下表獲取時間數據類型(MSSQL08)的總和

澄清:我代表的視頻小時/分鐘/秒,想弄清楚的影片有多長。

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 

我想得到所有這些時間的總和。

+0

爲什麼?這沒有意義。 – dkretz 2009-05-29 16:00:19

+3

我不認爲這是毫無意義的......也許這些是專輯中歌曲的持續時間,他想要整個專輯的總時長?只有一種可能性...... – JosephStyons 2009-05-29 16:17:29

回答

6

我沒有用太多2008年還和我沒有一個實例方便我在哪裏檢查這一點,但這樣的事情可能工作:

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

勒dorfier指出,加倍有點無意義,因爲它們應該代表一天的時間。我假設你正在使用它們來表示小時/分鐘/秒。

哦,我不知道如果超過24小時,會發生什麼。

0

我能想到的最好方法是將時間跨度分解成小時,分鐘,秒和毫秒分量,將其全部轉換爲毫秒(通過加法和乘法),然後加上它們並使用模和減法來轉換它回到時間跨度。

例如

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 

然後SELECT dbo.ParseMilliseconds(sum(dbo.GetMilliseconds(timespan))) as added_timespan

我沒有測試過這一切,並有可能成爲更簡單的方法,但我知道這會工作。

0

從時間表

SELECT SUM(DATEDIFF(MINUTE, '0:00:00',TimeCol))一些變化

工作,但

你將不得不減去正常化日期部分從每個日期時間和 你將不得不將總分鐘轉換爲時間