You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL中Arithmetic overflow error问题求助:时间戳转换触发溢出

解决SQL Server中时间戳转换的算术溢出错误

我来帮你搞定这个算术溢出问题!咱们先拆解下每个查询出错的原因,再给出对应的解决办法:

错误原因分析

  • 查询2:你直接把毫秒级时间戳作为DATEADD的second间隔参数,这就踩坑了!1526640929000毫秒等于15亿多秒,而SQL Server中DATEADD的间隔参数默认是int类型,最大值只有2147483647(约68年),这个数值远远超出范围,必然触发溢出。
  • 查询3:虽然你把毫秒转成了秒,但LAST_SCAN_TIME是bigint类型,除以1000后结果还是bigint。DATEADD不直接支持bigint作为间隔参数,SQL Server会尝试隐式把bigint转成int,如果有时间戳对应的秒数超过int最大值(比如2038年1月19日之后的时间),就会溢出;哪怕当前数据没超,隐式转换也可能触发错误。
  • 查询1:你错误地把DATEADD返回的datetime类型直接转成int,这种转换本身没有实际意义,而且如果前面的DATEADD步骤已经溢出,自然会报错。

解决方案

方案1:使用DATEADD_BIG(SQL Server 2016+适用)

这个函数是专门用来处理大数值间隔的,支持bigint类型参数,完美解决溢出问题:

-- 方式1:转成秒后转换
SELECT DATEADD_BIG(second, SA.LAST_SCAN_TIME / 1000, '19700101') AS 'Last scan time'
FROM SEM_AGENT SA

-- 方式2:直接用毫秒作为间隔
SELECT DATEADD_BIG(millisecond, SA.LAST_SCAN_TIME, '19700101') AS 'Last scan time'
FROM SEM_AGENT SA

方案2:显式转换为int(仅适用于时间戳不晚于2038-01-19)

如果你的所有时间戳都不会超过2038年1月19日(这个日期对应的秒数是int的最大值2147483647),可以显式把秒数转成int:

SELECT DATEADD(second, CAST(SA.LAST_SCAN_TIME / 1000 AS INT), '19700101') AS 'Last scan time'
FROM SEM_AGENT SA

方案3:兼容旧版SQL Server的转换方式

如果你的SQL Server版本低于2016,没法用DATEADD_BIG,可以用datetime2类型配合数值计算来转换:

SELECT CAST('19700101' AS DATETIME2) + CAST(SA.LAST_SCAN_TIME / 1000.0 AS DECIMAL(18,5)) / 86400 AS 'Last scan time'
FROM SEM_AGENT SA

原理是:把秒数除以86400(一天的总秒数)得到天数,再加到1970-01-01的datetime2类型上,datetime2支持更大的时间范围和精度,不会出现溢出。

另外,如果你确实需要数值形式的日期(比如yyyymmdd格式的数字),可以这样写,避免直接转换datetime到int的风险:

SELECT CONVERT(INT, CONVERT(VARCHAR, DATEADD_BIG(second, SA.LAST_SCAN_TIME / 1000, '19700101'), 112)) AS 'Last scan time (numeric)'
FROM SEM_AGENT SA

内容的提问来源于stack exchange,提问作者deepti

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:45:18