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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 21:21:12