SQL Server: 将表达式转换为 int 数据类型时出现算术溢出错误

我得到了这个错误

味精8115级16状态2第18行
将表达式转换为 int 数据类型时出现算术溢出错误。

使用这个 SQL 查询

DECLARE @year VARCHAR(4);
DECLARE @month VARCHAR(2);


-- START OF CONFIGURATION SECTION
-- THIS IS THE ONLY SECTION THAT SHOULD BE MODIFIED
-- SET THE YEAR AND MONTH PARAMETERS


SET @year = '2013';
SET @month = '3';  -- 1 = January.... 12 = Decemeber.


-- END OF CONFIGURATION SECTION


DECLARE @startDate DATE
DECLARE @endDate DATE
SET @startDate = @year + '-' + @month + '-01 00:00:00';
SET @endDate = DATEADD(MONTH, 1, @startDate);


SELECT
DATEPART(YEAR, dateTimeStamp) AS [Year]
, DATEPART(MONTH, dateTimeStamp) AS [Month]
, COUNT(*) AS NumStreams
, [platform] AS [Platform]
, deliverableName AS [Deliverable Name]
, SUM(billableDuration) AS NumSecondsDelivered
FROM
DeliveryTransactions
WHERE
dateTimeStamp >= @startDate
AND dateTimeStamp < @endDate
GROUP BY
DATEPART(YEAR, dateTimeStamp)
, DATEPART(MONTH, dateTimeStamp)
, [platform]
, deliverableName
ORDER BY
[platform]
, DATEPART(YEAR, dateTimeStamp)
, DATEPART(MONTH, dateTimeStamp)
, deliverableName
367415 次浏览

SUM(billableDuration)有什么问题吗? 要找出答案,请尝试注释掉那一行,看看它是否有效。

可能是总和超过了最大 int。如果是这样,试着用 SUM(CAST(billableDuration AS BIGINT))代替它。

SELECT
DATEPART(YEAR, dateTimeStamp) AS [Year]
, DATEPART(MONTH, dateTimeStamp) AS [Month]
, COUNT(*) AS NumStreams
, [platform] AS [Platform]
, deliverableName AS [Deliverable Name]
, SUM(billableDuration) AS NumSecondsDelivered

假设引用的文本是精确的文本,则其中一列无法执行所需的数学计算。双击错误,它会突出显示导致问题的行(如果它与发布的内容不同,可能不在那里) ; 我用变量测试了你的代码,没有问题,这意味着这些列中的一个(我们不知道更具体的信息)正在创建这个错误。

需要将一个表达式强制转换为 int 才能执行此操作,这就是 Arithmetic overflow error converting expression to data type int的含义。

SUM(billableDuration) AS NumSecondsDelivered更改为

sum(cast(billableDuration as bigint)) 或者

sum(cast(billableDuration as numeric(12, 0)))根据您的需要。

Sum 表达式的结果类型与所使用的数据类型相同。它在溢出时抛出错误。因此,将列转换为更大容量的数据类型,然后使用 Sum 操作可以很好地工作。

declare @d real
set @d=1.0;
select @d*40000*(192+2)*20000+150000

在我这边,此错误来自 Null 值列中的数据类型“ INT”。 只需将数据 a 类型更改为 varchar 即可解决此错误。

很简单:

Use COUNT_BIG(*) AS NumStreams