开发同事有一个脚本报错,很简单,简写如下:
SELECT COUNT(*)FROM Logs t1 with(nolock)WHERE DATEDIFF(s,'2016-08-18 17:06:35',t1.insertTime) < 0
执行后出错!
Msg 535,Level 16,State 0,line 1
The datediff function resulted in an overflow.
The number of dateparts separating two date/time instances is too large.
Try to use datediff with a less precise datepart.
datediff 函数计算溢出!难道 datediff 计算出来的的秒数超出了范围?
果然,官方文档如下:(DATEDIFF (Transact-SQL))
如果返回值超出 int 的范围(-2,147,483,648 到 +2,647),则会返回一个错误。 对于 millisecond,startdate 与enddate 之间的最大差值为 24 天 20 小时 31 分钟 23.647 秒。 对于 second,最大差值为 68 年。
查看数据库,竟然有7行时间为: 2099-08-10 11:33:37.367 ,这样转换肯定出错了,错误如上一样。可以试试。
select DATEDIFF(s,'2000-01-01 00:00:00','2068-01-19 04:00:00')select DATEDIFF(s,'2068-01-19 03:00:00') --2147482800
相差秒数为 2147482800,为 整型 int 的范围内。
也可以看看 datediff 返回的类型是什么:整型
SELECT sql_VARIANT_PROPERTY(DATEDIFF(s,'2068-01-19 03:00:00'),'BaseType')
所以,数据库存在了日期较大的值,这个原本也是错误的数据。还有就是写的语句也有问题,不应该这么写,应改成下面的写法更规范,否则即使有索引页不能使用!
SELECT COUNT(*)FROM Logs t1 with(nolock)WHERE t1.insertTime < '2016-08-18 17:06:35'总结
以上是内存溢出为你收集整理的SQLServer The datediff function resulted in an overflow全部内容,希望文章能够帮你解决SQLServer The datediff function resulted in an overflow所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)