Luk*_*ina 5 sql sql-server-2008
我有一些SQL将javascript日期转换为SQL日期,效果很好.但是,我已经遇到了一些太大而导致异常的数据:
将表达式转换为数据类型int的算术溢出错误
这是有问题的SQL:
DATEADD(MILLISECOND, cast(569337307200000 as bigint) % 1000, DATEADD(SECOND, cast(569337307200000 as bigint) / 1000, '19700101'))
Run Code Online (Sandbox Code Playgroud)
我在SQL Server 2008上运行它.
小智 9
只需DATEADD分两步解决问题,从粗略的时间单位(秒、分钟、小时等)开始,然后再回到细粒度的时间单位。
避免进入周和月的级别,因为这需要实际的日历计算,我们希望系统能够处理它。
下面的示例需要计算给定(可能)大电流持续时间(以毫秒为单位)的开始时间。
-- large durations can overflow the integer argument needed for DATEADD
-- so do as two steps subtracting minutes (60000ms) and then remaining milliseconds.
DATEADD(ms, -large_duration_ms%60000, DATEADD(minute, -large_duration_ms/60000, GETDATE()))
Run Code Online (Sandbox Code Playgroud)
小智 5
解决Integer溢出问题的一种方法是从microtime unix时间戳中减去一个更近的日期.
DATEADD(s, (CreationTimeStamp/1000-1384128000), '2013-11-11') AS CreateDate,
Run Code Online (Sandbox Code Playgroud)
这不会解决OP的问题,因为它们仍会溢出日期列的最大值.