大整数的 DATEADD 陷阱
使用大整数时间戳时,SQL Server 中的 DATEADD 函数可能会遇到限制。本文探讨了大整数值导致算术溢出错误的特定情况。
问题
考虑以下 SQL 语句,旨在将大的 JavaScript 时间戳转换为SQL 日期:
DATEADD(MILLISECOND, cast(569337307200000 as bigint) % 1000, DATEADD(SECOND, cast(569337307200000 as bigint) / 1000, '19700101'))
在 SQL Server 2008 上,执行此语句会导致“算术溢出错误将表达式转换为数据类型 int。”
解决方案
克服此错误的关键在于将 DATEADD 操作分解为更小的块。通过最初以较大的单位(例如秒或分钟)添加时间,然后添加剩余的毫秒,我们可以避免溢出。
例如,以下语句计算给定较长持续时间的开始时间(在milliseconds):
DATEADD(ms, -large_duration_ms%60000, DATEADD(minute, -large_duration_ms/60000, GETDATE()))
此示例首先从大持续时间中减去分钟,然后添加剩余的毫秒。这种方法可以确保中间计算不会溢出。
以上是SQL Server DATEADD:如何避免大整数时间戳的算术溢出?的详细内容。更多信息请关注PHP中文网其他相关文章!