SQL Server毫秒级时间戳转时间的方法
作者:技术拾光时间:2026-06-12 08:48:07浏览:632
在SQLServer中,处理毫秒级时间戳时,因超出int范围导致DATEADD算术溢出。正确步骤:先将时间戳除以1000取整得秒数,取模得毫秒,然后对秒用DATEADD转换,再追加毫秒部分,即可得到可读时间。此法避免溢出问题,确保转换精确,且简单有效。
在物联网项目中,时间数据常以毫秒级时间戳形式存储。当使用 SQL Server 尝试将这些数值转换为人类可读的时间时,开发者经常会遇到以下报错信息:将 expression 转换为数据类型 int 时出现算术溢出错误。

SELECT DATEADD(MILLISECOND, 1757304100073, '1970-01-01 00:00:00') 消息 8115,级别 16,状态 2,第 10 行 将 expression 转换为数据类型 int 时出现算术溢出错误。
原因分析
为何会出现这一错误?根本原因在于 DATEADD 函数的第二个参数(即间隔数量)在使用 MILLISECOND 参数类型时存在严格的取值范围限制。当数值超过 int 类型所能容纳的最大值(2,147,483,647)时,系统便会直接报错。
以示例中的时间戳 1757304100073 为例,该毫秒级数值远大于 int 类型的上限。因此,直接使用 MILLISECOND 参数处理该数值,必然会触发算术溢出问题。
解决办法:分两步转换
如何绕过这一限制?思路非常直接:将毫秒级时间戳拆解,分别处理秒和毫秒部分。
关键操作在于:先将毫秒级时间戳除以 1000,得到总秒数;再通过取模运算获取剩余的毫秒数。这样,秒数部分使用 SECOND 参数转换(无溢出风险),而毫秒部分的值也必然处于 int 的安全范围之内。
DECLARE @timestamp BIGINT = 1757304100073;
-- 计算总秒数和剩余毫秒数
SELECT
DATEADD(MILLISECOND, @timestamp % 1000, -- 剩余毫秒数
DATEADD(SECOND, @timestamp / 1000, '1970-01-01 00:00:00') -- 秒级时间戳转换
)
--查询结果 2025-09-08 04:01:40.073
总结
以上方法是经过实战验证的有效方案,遇到类似问题的开发者可以直接套用。希望本文能帮助到有同样困惑的读者,也欢迎持续关注本站后续更多实用技巧分享。
