使用bigint处理datediff仍遇溢出,求数据类型解决方案
解决SQL Server中DATEDIFF微秒计算溢出问题
问题根源
你遇到的溢出是因为SQL Server的DATEDIFF函数默认返回int类型,而1970年 epoch 到当前日期的微秒间隔远超过int的最大值(2^31-1,约21亿),计算时直接溢出,后续转bigint也无法挽回。
解决方案
方案1:使用DATEDIFF_BIG(SQL Server 2016及以上版本)
SQL Server 2016及以后提供了DATEDIFF_BIG函数,它直接返回bigint类型,支持更大的间隔计算,修改你的函数即可:
alter function [dbo].[date2timestamp] (@dateStr char(255)) returns bigint as begin -- 建议使用ISO标准日期格式避免解析错误 return datediff_big(microsecond, '1970-01-01 00:00:00', @dateStr) end
方案2:手动拆分计算(兼容SQL Server 2016以下版本)
如果你的版本不支持DATEDIFF_BIG,可以拆分日期间隔为天、时、分、秒、微秒,用bigint逐步累加计算:
alter function [dbo].[date2timestamp] (@dateStr char(255)) returns bigint as begin declare @epoch datetime = '1970-01-01 00:00:00' declare @target datetime = convert(datetime, @dateStr) -- 计算整数天数间隔(转为bigint) declare @days bigint = datediff(day, @epoch, @target) -- 计算当天剩余时间的间隔 declare @remaining_time time = @target - @epoch return @days * 86400000000 -- 1天=86400*1000000微秒 + datepart(hour, @remaining_time) * 3600000000 + datepart(minute, @remaining_time) * 60000000 + datepart(second, @remaining_time) * 1000000 + datepart(microsecond, @remaining_time) end
额外建议
- 尽量将
@dateStr的参数类型改为datetime或varchar,避免char(255)带来的不必要空格或转换问题; - 使用
'1970-01-01'这种ISO标准日期格式,避免因服务器区域设置导致的日期解析错误。
内容的提问来源于stack exchange,提问作者3313 aloha
相关产品推荐
相关产品推荐

