63

我收到此错误

msg 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   
4

6 回答 6

103

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

可能是总和超过了最大值int。如果是这样,请尝试将其替换为SUM(CAST(billableDuration AS BIGINT)).

于 2013-04-11T13:59:57.890 回答
17

更改SUM(billableDuration) AS NumSecondsDelivered

sum(cast(billableDuration as bigint)) 或者

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

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

于 2016-01-18T05:31:45.327 回答
15

很简单:

Use COUNT_BIG(*) AS NumStreams
于 2019-12-23T18:41:42.150 回答
1
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.

于 2013-04-11T14:43:46.220 回答
0

就我而言,此错误来自 Null 值列中的数据类型“INT”。只需将数据类型更改为 varchar 即可解决该错误。

于 2018-08-28T19:45:37.207 回答
-4
declare @d real
set @d=1.0;
select @d*40000*(192+2)*20000+150000
于 2016-12-27T05:34:10.457 回答