arithmet_overflow错误类

SQLSTATE: 22003

<消息><可选>必要时设置<设置>以“false”绕过此错误。

参数

  • 消息:导致溢出的表达式的描述。

  • 替代:建议如何避免此错误。

  • 配置:更改ANSI模式的配置设置。

解释

当Databricks执行的数学操作超出所执行操作的数据类型的最大范围时,就会发生算术溢出。

在许多情况下,数学是在操作符的操作数的最小公共类型或函数的参数的最小公共类型中执行的。

加上两个类型的数字非常小的整数能否迅速超出限定的种类范围-128年+ 127。其他类型,比如时间戳而且时间间隔也有很大,但有限的范围。

有关类型域的定义,请参见数据类型的定义

缓解

此错误的缓解取决于原因:

  • 数学运算或输入参数是否不正确?

    正确使用的函数或适当的输入数据。

    您还可以考虑重新排序操作,以将中间结果保持在所需的范围内。

  • 数据类型不是最宽的类型吗?

    通过将其中一个参数强制转换为足以完成操作的类型来拓宽类型。

    选择小数(38岁s)用合适的年代以舍入为代价提供了很大的范围。

  • 您能否容忍溢出条件并将其替换为?

    将表达式更改为使用中提出的函数替代。例如使用try_sum而不是总和

  • 你不能改变表达式,你宁愿得到包装的结果而不是返回一个错误?

    方法禁用ANSI模式,作为最后的手段ansiConfig

例子

——一个小数字溢出>选择One hundred.YOne hundred.Y(ARITHMETIC_OVERFLOWOne hundred.年代One hundred.年代引起的溢出如果必要的ansi_mode“假”除了ANSI时间间隔类型绕过错误——通过强制转换其中一个操作数,使用更宽的数字来执行该操作>选择One hundred.YOne hundred.Y作为整数);10000—可以重写的复杂表达式的溢出>选择One hundred.Y10Y/5(ARITHMETIC_OVERFLOWOne hundred.年代10年代引起的溢出如果必要的火花sqlansi启用“假”除了ANSI时间间隔类型绕过错误——重写表达式>选择One hundred.Y/510Y2000偶尔的夸夸其谈是可以容忍的>选择__arg1最长One hundred.YOne hundred.Y),20.Y5Y作为t__arg1最长);(ARITHMETIC_OVERFLOWOne hundred.年代One hundred.年代引起的溢出如果必要的ansi_mode“假”除了ANSI时间间隔类型绕过错误——允许溢出被视为NULL>选择try_multiply__arg1最长One hundred.YOne hundred.Y),20.Y5Y作为t__arg1最长);One hundred.在Databricks SQL中暂时禁用ANSI模式以容忍错误溢出。>ANSI_MODE>选择__arg1最长One hundred.YOne hundred.Y),20.Y5Y作为t__arg1最长);16One hundred.>ANSI_MODE真正的——在Databricks运行时暂时禁用ANSI模式,以容忍不正确的溢出。>火花sqlansi启用>选择__arg1最长One hundred.YOne hundred.Y),20.Y5Y作为t__arg1最长);16One hundred.>火花sqlansi启用真正的