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

时间:2013-04-11 13:51:52

标签: sql sql-server tsql

我收到此错误

  

消息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   

6 个答案:

答案 0 :(得分:60)

问题是SUM(billableDuration)吗?要找到答案,请尝试评论该行,看看它是否有效。

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

答案 1 :(得分:4)

SUM(billableDuration) AS NumSecondsDelivered更改为

sum(cast(billableDuration as bigint))

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

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

答案 2 :(得分: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的含义。

答案 3 :(得分:0)

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

答案 4 :(得分:0)

非常简单:

|

答案 5 :(得分:-2)

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