2012-10-06 153 views
4

我在Microsoft SQL Server 2008R2中有一个bigint字段,填充了刻度(单个刻度表示百纳秒或百万分之一秒,一毫秒内有10,000个刻度。)将毫秒转换为天,小时,分和秒

http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx

,我需要的所有记录的总和转换为天:小时:分钟:秒:毫秒。

它适用于单条记录:

SELECT CONVERT(TIME, DATEADD(ms, duration/10000, 0)) FROM tblMediaFileProperties WHERE FileId = '6C0A849D-95B4-4755-A923-B9DD8F1AF23E' 

但如果总结一下所有记录使用:

SELECT CONVERT(TIME, DATEADD(ms, SUM(duration/10000), 0)) FROM tblMediaFileProperties 

我得到一个:

算术溢出错误将表达式转换为数据类型int。

我知道溢出来自CONVERT数据类型TIME功能...

帮助的感谢,谢谢!

回答

4

这对DATEADD来说太大了,它只接受int
将其分为两部分:秒,然后毫秒。

SELECT CONVERT(TIME, 
      DATEADD(ms, SUM(duration/10000 % 1000), 
      DATEADD(ss, SUM(duration/10000000), 0))) 
FROM tblMediaFileProperties 

如果您的总持续时间超过1天,您可以分别使用它获取天数和hr:min:sec:ms。如果你真的想要文本形式的结果,这是一个铸造和字符串concat的问题。

declare @duration bigint 
set @duration = 1230000000 
SELECT @duration/10000/1000/60/60/24 DAYS, 
     CONVERT(TIME, 
      DATEADD(ms, SUM(@duration/10000 % 1000), 
      DATEADD(ss, SUM(@duration/10000000), 0))) HR_MIN_SEC 
+0

+1现在我认为你的答案涵盖了基本问题 – Steve