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