日期:2014-05-17  浏览次数:20895 次

dateadd增加毫秒过大溢出
本帖最后由 ipnated 于 2013-04-01 16:23:29 编辑
select dateadd(second,ms/1000,'1970-01-01 08:00:00') from table1;
这样就没问题

select dateadd(millisecond,ms,'1970-01-01 08:00:00') from table1;
这样就错:
将 expression 转换为数据类型 int 时出现算术溢出错误。

是不是ms的值过大了?
那以秒记的话 ms/1000除以1000的值也过大怎么办?
不会溢出的极限是多少?


------解决方案--------------------

如果 datepart 为 second 且 number 介于 -30 和 +29 之间,则不执行加法。 


如果 datepart 为 second 且 number 小于 -30 或大于 +29,则以一分钟为起值执行加法。 


如果 datepart 为 millisecond 且 number 介于 -30001 和 +29998 之间,则不执行加法。 


如果 datepart 为 millisecond 且 number 小于 -30001 或大于 +29998,则以一分钟为起值执行加法。 


------解决方案--------------------
DATEADD (datepart , number , date )

 number
    一个表达式,它可以解析为与 date 的 datepart 相加的 int。 用户定义的变量是有效的。 

 int  -2^31 (-2,147,483,648) 到 2^31-1 (2,147,483,647)  4 字节