所以,只是为了举例说明我们的程序最终如何处理数据并提出此错误,这里有一些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
在其可以容纳的位置最大化,我相信是38.我不知道我还能做些什么来获得这个值。您是否应该能够在SQL中将integer
除以decimal
并从中获取一些内容,尤其是decimal
最大化时?
答案 0 :(得分:7)
在您的示例中,@daysInPeriod/@YEAR_360
的值为37.0444444444444444444
。因此,您无法将该值分配给数据类型DECIMAL(38,38)
的参数,因为您不会留下int部分的空间。 DECIMAL(38,38)
表示您可以存储38位数字,其中38位在小数部分,因此任何大于0.999999999999的值都会产生错误。
答案 1 :(得分:1)
问题是您声明@dcFraction
为DECIMAL(38,38)
。你说你想要小数点右边的所有38位数字,左边的整数部分没有空间。
答案 2 :(得分:1)
如果你给小数点一个较小的比例,那就可以了:
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