0

是的,我知道还有其他人问过同样的问题,但他们的解决方案在这种情况下不起作用。

这是我的问题。

我正在对大量整数求和。事实上,太多以至于 SUM 函数不起作用。

所以我这样做:

Sum(cast(LotsofIntegers as decimal)) 这给了我 3472201304

我想在 hh:mm:ss 中查看这个。问题是 Dateadd 函数不会接受这么大的数字。否则我只能这样做

CONVERT(VARCHAR,DATEADD(ms,Sum(cast(LotsofIntegers as decimal)),0),114)

这是常见的解决方案。

我宁愿不必在一大堆部门中以非常艰难的方式做到这一点。

有人可以帮忙吗?

4

1 回答 1

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;

在 5,000,001 行的总和为 25,000,706,152(在 64 位算术下)的表上,我得到了6944:38:26.

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

于 2012-08-16T06:44:49.513 回答