SQL Server转换Epoch日期遇算术溢出错误,本地正常办公环境异常
问题原因及解决方法
错误原因
SQL Server中DATEADD(second, 秒数, 起始时间)函数的秒数参数默认仅支持int类型,而int的最大值是2147483647,对应Epoch时间为2038-01-19 03:14:07。
你的办公环境里,Table_Time_Test1表的Time字段(bigint类型)中存在大于2147483647的数值,执行DATEADD时,SQL Server会自动将bigint类型的Time隐式转换为int,超出int范围就触发「Arithmetic overflow error converting expression to data type int」错误。
而你家中的环境里,所有Time值都在int的有效范围内(比如示例值1673380730远小于2147483647),所以转换正常。
解决方法
根据你的SQL Server版本选择对应的方案:
方案1:使用DATEADD_BIG(SQL Server 2022及以上版本)
DATEADD_BIG专门支持bigint类型的间隔数参数,直接替换原函数即可:
SELECT FORMAT(DATEADD_BIG(second, Time, CAST('1970-01-01' AS datetime)), 'yyyyMMdd') AS created_time FROM Table_Time_Test1
方案2:转换为datetime2类型兼容更大范围(全版本通用)
datetime2类型的时间范围比datetime更广,结合显式转换可以避免溢出:
SELECT FORMAT(CAST('1970-01-01' AS datetime2) + Time/1.0/86400, 'yyyyMMdd') AS created_time FROM Table_Time_Test1
也可以继续使用DATEADD,通过指定datetime2起始时间来兼容更大数值:
SELECT FORMAT(DATEADD(second, CAST(Time AS bigint), CAST('1970-01-01' AS datetime2)), 'yyyyMMdd') AS created_time FROM Table_Time_Test1
内容的提问来源于stack exchange,提问作者jeebee
相关产品推荐
相关产品推荐

