2012-08-16 91 views
0

是的我知道还有其他人问过同一个问题,但他们的解决方案在这种情况下不起作用。将毫秒转换为小时,分和秒

这里是我的问题。

我总结了一个真正大量的整数。实际上很多SUM函数都不起作用。

所以我这样做:

总和(CAST(LotsofIntegers为十进制)),这给了我3472201304

我想在HH查看此:MM:SS。问题是Dateadd函数不会接受这么大的数字。否则,我可能只是这样做

CONVERT(VARCHAR,DATEADD(MS,SUM(CAST(LotsofIntegers为 十进制)),0),114)

这是常见的解决方案。

我宁愿不用非常辛苦的方式来做这个事情,而且还有很多分歧。

任何人都可以协助吗?

回答

0

试试这个(MySQL的句法;转换到您选择的RDBMS):

SELECT CONCAT( 
    CAST((@hours := FLOOR(SUM(msec)/3600000)) AS CHAR), 
    ":", 
    CAST((@minutes := FLOOR((SUM(msec) - @hours * 3600000)/60000)) AS CHAR), 
    ":", 
    CAST((@seconds := FLOOR((SUM(msec) - @hours * 3600000 - @minutes * 60000)/1000)) AS CHAR) 
) FROM my_table WHERE 1; 

上的5000001行的表用25000706152的总和(在64位运算),我得到的正确答案6944:38:26

问题似乎是由于4字节的内部表示,最常见的RDBMS日期差异类(包括您似乎正在使用的MSSQL)只能支持2^3210毫秒的差异。这是所讨论的RDBMS的局限性;显然每次超过40亿msec的工作超出了设想的用例。所以不幸的是,除非发布补丁来扩展内置功能(或者存在一个我没有听说过的升级功能!),但漫长的路要走。

+0

好的,谢谢你。我想这是很长的路。 – user1413844 2012-08-21 06:12:51