SQL:将DATEADD与bigint一起使用

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)

  • 第二个 DATEADD() 中的“天”应该是“分钟”,否则这有效 (2认同)

小智 5

解决Integer溢出问题的一种方法是从microtime unix时间戳中减去一个更近的日期.

DATEADD(s, (CreationTimeStamp/1000-1384128000), '2013-11-11') AS CreateDate,
Run Code Online (Sandbox Code Playgroud)

这不会解决OP的问题,因为它们仍会溢出日期列的最大值.


Kaf*_*Kaf 3

根据MSDN 的说法,在DATEADD (datepart , number , date )

number是一个表达式,可以解析为添加到日期的日期部分的 int。用户定义的变量有效。如果指定带有小数的值,则该分数将被截断且不会四舍五入。

另请注意,即使您将数字指定为整数,根据您的日期和日期部分,它也可能会溢出日期的最大范围,即 sql server 2008 的 31-12-9999

数字必须是整数。这是一个测试演示