Ошибка арифметического переполнения в SQL - PullRequest
1 голос
/ 15 декабря 2011

Так что просто для того, чтобы дать вам пример того, как наша процедура в конечном итоге будет работать с данными, и получить эту ошибку, вот несколько SQL:

DECLARE @daysInPeriod  INT
DECLARE @dcFraction    DECIMAL(38,38)
DECLARE @YEAR_360         DECIMAL
SET @YEAR_360 = 360.0000000000
SET @daysInPeriod = DATEDIFF(dd, '12/24/1970', '6/29/07')
SET @dcFraction = @daysInPeriod/@YEAR_360

Если вы запустите это в SQL Server 2008 R2, вы увидите, что вы получите ошибку 'Arithmetic overflow error converting numeric to data type numeric.'.

decimal, для которого я устанавливаю значение, является max'd out с точки зрения мест, которые оно может содержать, и я считаю, что это 38. Я не знаю, что еще я могу сделать, чтобы получить это значение. Разве вы не можете разделить integer на decimal в SQL и получить что-то из этого, особенно если decimal max max?

Ответы [ 3 ]

7 голосов
/ 15 декабря 2011

В вашем примере значение @daysInPeriod/@YEAR_360 равно 37.0444444444444444444.Таким образом, вы не можете присвоить это значение параметру типа данных DECIMAL(38,38), так как вы не оставляете места для части int.DECIMAL(38,38) означает, что вы можете хранить 38 цифр, и 38 из них находятся в десятичной части, поэтому любое значение больше 0.999999999999 вызовет ошибку.

1 голос
/ 15 декабря 2011

Если вы зададите десятичную шкалу меньшего масштаба, она будет работать:

DECLARE @daysInPeriod  INT
DECLARE @dcFraction    DECIMAL(38,12)
DECLARE @YEAR_360         DECIMAL
SET @YEAR_360 = 360.0000000000
SET @daysInPeriod = DATEDIFF(dd, '12/24/1970', '6/29/07')
SET @dcFraction = @daysInPeriod/@YEAR_360
select @dcFraction

Возвращает 37.044444444444

1 голос
/ 15 декабря 2011

Проблема в том, что вы объявили @dcFraction как DECIMAL(38,38).Вы говорите, что хотите, чтобы все 38 цифр были справа от десятичной запятой, без места для целой части слева.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...