【问题标题】:Arithmetic overflow error...Please Help. SQL算术溢出错误...请帮助。 SQL
【发布时间】:2013-06-22 01:54:59
【问题描述】:

我收到错误消息

将表达式转换为数据类型浮点数时出现算术溢出错误

关于以下代码:

SELECT b.[CUSIP NUMBER],
   b.[PASS THRU RATE],
   a.[CURRENT BALANCE],
   b.[ORIGINAL WA MATURITY],
   b.[CURRENT WA MATURITY],
   (b.[ORIGINAL BALANCE] * ((b.[PASS THRU RATE]*.01)/12))/ (1-((1 + power (( (b.[PASS THRU RATE]*.01 )/ 12), -b.[ORIGINAL WA MATURITY] ) )))

   FROM DBO.mbs012013 a, DBO.mbs022013 b
   WHERE a.[CUSIP NUMBER] = b.[CUSIP NUMBER]

我没有将数字指定为任何特定类型,因此我不确定为什么会收到此错误。如果有人能告诉我如何解决这个问题,将不胜感激。

供参考:cusip number 是一个序列号,其余为输入(利率、银行余额、到期月份等)

【问题讨论】:

标签: sql sql-server sql-server-2012


【解决方案1】:

你说PASS THRU RATE可以是1-10ORIGINAL WA MATURITY之间的0 - 360

那么对您来说最糟糕的情况是 PASS THRU RATE = 1 和 ORIGINAL WA MATURITY = 360

在这种情况下你会这样做

SELECT POWER(0.0008333333333, -360)

结果为@​​987654321@。 SQL Server 中没有任何数据类型的范围大于 float,并且“仅”允许范围为 ± 1.79E+308

如果您需要进行这些计算,则需要在 TSQL 之外进行。但是您确定您的公式实际上是正确的吗?

它不应该是其中之一吗?

SELECT POWER(1 + 0.0008333333333, -360)

SELECT POWER(1 - 0.0008333333333, -360)

【讨论】:

    【解决方案2】:

    问题大概出在这里:

    power (( (b.[PASS THRU RATE]*.01 )/ 12), -b.[ORIGINAL WA MATURITY] )
    

    如果b.[PASS THRU RATE] 很小而-b.[ORIGINAL WA MATURITY] 很大,则最终的结果可能比NUMERIC 类型所能容纳的要大。尝试将它们转换为浮点数:

    power (( CAST(b.[PASS THRU RATE]*.01 / 12) AS FLOAT), -b.[ORIGINAL WA MATURITY] ) )))
    

    【讨论】:

    • 错误信息抱怨溢出转换 to 浮动。
    • @MartinSmith - 奇怪的是,select Power( .01, -350 ) 的结果是 Arithmetic overflow error converting expression to data type float.
    • @HABO - 那是1E+700。浮点数上升到1.79E+308
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多