CAST/CONVERT 问题 算术溢出错误

Posted

技术标签:

【中文标题】CAST/CONVERT 问题 算术溢出错误【英文标题】:CAST/CONVERT problem Arithmetic overflow error 【发布时间】:2019-08-30 01:01:53 【问题描述】:

SELECT 有效,但 UPDATE 无效。

CASTCONVERT 的每个版本

我收到此错误:

将 int 转换为数据类型 numeric 的算术溢出错误

当我尝试这样做时:

$sql = "UPDATE rentinc ".
       "SET curr_loss_mo = ROUND(CONVERT(numeric(3,0), DATEDIFF(DAY, missincdate, GETDATE()) / 30), 0) ".
       "WHERE months2 > 12";

我很确定上面的代码有些矫枉过正,但我​​正在尝试一切。

我可以转到 SSMS 并运行此 SELECT:

SELECT curr_loss_mo, ROUND(CONVERT(numeric(3, 0), DATEDIFF(DAY, missincdate, GETDATE()) / 30), 0) AS DateNumCalc
FROM rentinc
WHERE months2 > 12

而且效果很好。而且这两列看起来一模一样! curr_loss_mo 字段是 numeric(3,0),表中没有任何值会尝试使用超过三个字符进行更新。

那么为什么会出现这个错误?

“将 int 转换为数据类型 numeric 的算术溢出错误”

【问题讨论】:

我不太明白这两个查询之间有什么关系。它们具有不同的过滤条件,因此它们不会处理同一组行。 您对两个查询有不同的WHERE 条件。尝试在MMS 中使用相同的条件,这可能是curr_loss_mo IS NULL 导致您的问题的情况 这是 SQL Server 查询吗?如果是这样,请标记为这样 对于 1937 年 7 月 12 日至 2101 年 10 月 19 日之间的所有 missincdate 值,表达式应适合 numeric(3,0)(大致截至今天)。因为错误表明来自 @ 的转换987654334@ 是导致问题的原因,我认为它一定是由round() 函数引起的。您的日期值的列类型是什么?正如已经指出的那样,过滤器是不一样的。您是否有任何空白或零被视为 1900 年 1 月 1 日? rentinctemp_rentinc 是不同的表。它们是否具有相同的架构? 【参考方案1】:

事实证明,这个谜团变得更深了,但我找到了解决方法,所以我处理了它。

我制作了名为 temp_rentinc 的rentinc 表的临时副本。这是一个 EXACT COPY,如“SELECT * INTO temp_rentinc FROMrentinc”。

出于令我完全困惑的原因,我在上面发布的更新代码适用于 temp_rentinc,但不适用于rentinc!莫名其妙,我写了一个程序,通过“SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = '每个表名'来比较结构。”

程序验证它们完全一样。叹。有时,小精灵会抓住你。长话短说,我杀死了原始表,并反转 SELECT INTO 以重新创建表,代码现在可以正常工作了。

这在“WTF”中?文件。谢谢各位的意见。 ——约翰

【讨论】:

以上是关于CAST/CONVERT 问题 算术溢出错误的主要内容,如果未能解决你的问题,请参考以下文章

Azure ADF 错误算术溢出错误将表达式转换为数据类型 int

货币类型的算术溢出错误

将 varchar 转换为数字数据类型时出现算术溢出错误。找不到存储过程''。?

分页时算术溢出错误

为啥在将 bigint 数插入 bigint 列时出现算术溢出错误?

smallint 的算术溢出错误——但数据类型是 int?