平均/求和毫秒时的算术溢出错误

时间:2018-09-05 14:47:07

标签: sql sql-server tsql

解决此问题时遇到很多麻烦(我翻阅了其他具有相同问题的帖子,但不幸的是,我没有为我的情况应用建议的解决方案的运气很好。

我有一个带有交易信息的(非常大的)表。列之一是“事务执行时间”(字段类型“时间”)。执行时间通常小于1秒,但可能要花几分钟。

需要提供每日,每周,每月和每年的交易报告,并且它们必须包含平均交易时间。由于大量条目,在进行平均值/求和时我面临溢出。

这是我用来测试的(简化)样本:

SELECT  
DATEPART (YEAR, TimeStamp) as 'Year',
COUNT(*) as 'Transaction count',
AVG((DATEDIFF(MILLISECOND, '0:00:00',ExecutionTime))) as 'Average execution time',
SUM((DATEDIFF(MILLISECOND, '0:00:00',ExecutionTime))) as 'Total execution time'
FROM RecordedTransactions
GROUP BY 
DATEPART (YEAR, TimeStamp)

解决溢出问题的最佳方法是什么?

2 个答案:

答案 0 :(得分:1)

您需要使用DATEDIFF_BIG而不是DATEDIFF

  

DATEDIFF_BIG(datepart,startdate,enddate)

     

此函数返回在指定开始日期和结束日期之间交叉的指定日期部分边界的计数(以带符号的大整数值)。

答案 1 :(得分:1)

请尝试确保将所有数据类型都视为BIGINT而不是int

SELECT DATEPART(YEAR, TimeStamp) AS Year,
       COUNT_BIG(*) AS [Transaction count],
       AVG((DATEDIFF_BIG(MILLISECOND, '0:00:00', ExecutionTime))) AS [Average execution time],
       SUM((DATEDIFF_BIG(MILLISECOND, '0:00:00', ExecutionTime))) AS [Total execution time]
FROM RecordedTransactions
GROUP BY DATEPART(YEAR, TimeStamp);

SUMAVG返回它们传递的相同数据类型。 COUNT返回int,而COUNT_BIG返回bigint。对于SUM,这意味着(如您的查询所示),如果超过2,147,483,647,它将失败。使用DATEDIFF_BIG表示返回的值为bigint,因此您的SUM最多可以返回9,223,372,036,854,775,807。