SQL Server: ошибка арифметического переполнения, преобразующая выражение в тип данных int

Я получаю эту ошибку

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   

Ответ 1

Является ли проблема с SUM(billableDuration)? Чтобы узнать, попробуйте прокомментировать эту строку и посмотрите, работает ли она.

Может быть, сумма превосходит максимум int. Если это так, попробуйте заменить его SUM(CAST(billableDuration AS BIGINT)).

Ответ 2

Изменить SUM(billableDuration) AS NumSecondsDelivered to

sum(cast(billableDuration as bigint)) или

sum(cast(billableDuration as numeric(12, 0))) соответствии с вашими потребностями.

Полученный тип выражения Sum совпадает с типом данных. Он выдает ошибку во время переполнения. Так что литье столбца в тип данных большей емкости, а затем использование операции Sum отлично.

Ответ 3

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.

Ответ 4

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