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

85

我遇到了这个错误

 

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   

3
请问您可以指出哪个数字超出了数据类型的范围吗?谢谢。 - user2270544
我该如何解决这个问题? - user2270544
@marc_s,我们可以对YYYY-MM-DD说同样的话吗?因为我在所有项目中都使用这种格式。提前致谢。 - anar khalilov
2
@Anar:如果您在DATE数据类型中使用YYYY-MM-DD,那么是安全的。然而,在DATETIME中,它是不安全的--不要以这种方式使用它!只使用YYYYMMDD没有破折号!)。为了演示,请在SQL Server Mgmt Studio中运行此小段代码:SET LANGUAGE german; SELECT CAST('2013-11-25' AS DATETIME) - 您将收到一个德语错误消息,告诉您无法将字符串转换为DATETIMESELECT CAST('20131125' AS DATETIME)没有破折号!)可以正常工作。 - marc_s
哇,这真的很有帮助,谢谢你。我会遵循你在大多数SQL相关问题上的建议,所以请继续分享。 - anar khalilov
显示剩余2条评论
6个回答

130

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

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


1
这个 CAST( 对我来说完美无缺,谢谢。 - Mohamad Osama

30

非常简单:

Use COUNT_BIG(*) AS NumStreams

21

SUM(billableDuration) AS NumSecondsDelivered改为

sum(cast(billableDuration as bigint))

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

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


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,这就是“算术溢出错误将表达式转换为数据类型int”的含义。

0

在我的情况下,这个错误来自于空值列中的数据类型“INT”。 只需将数据类型更改为varchar即可解决该错误。


你能否展示一些代码,这可能会有所帮助。 - Adeel Shekhani

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

13
请您能否在您的回答中加入一些解释? - slfan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接