从表中获取TIME数据类型(MSSQL08)的SUM

时间:2009-05-29 15:55:45

标签: sql sql-server tsql sql-server-2008

我有以下TIME数据类型表

澄清:我代表视频的小时/分钟/秒,并想知道视频的持续时间。

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

我希望得到所有这些时间的总和。

3 个答案:

答案 0 :(得分:6)

我还没有使用过2008,我没有一个方便的实例来检查这个,但是这样的事情可能有用:

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

正如le dorfier指出的那样,增加时间有点毫无意义,因为它们应该代表一天中的时间。我假设您使用它们来表示小时/分钟/秒。

哦,如果超过24小时,我不知道上面会发生什么。

答案 1 :(得分: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

我还没有对所有这些进行测试,可能会有更简单的方法,但我知道这会有效。

答案 2 :(得分:0)

的一些变体

SELECT SUM(DATEDIFF(MINUTE,'0:00:00',TimeCol))来自TimeTable

会有效但

您必须通过从每个日期时间减去日期部分进行标准化 你必须将总分钟转换为时间