加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQLServer The datediff function resulted in an overflow

发布时间:2020-12-12 13:26:21 所属栏目:MsSql教程 来源:网络整理
导读:开发同事有一个脚本报错,很简单,简写如下: SELECTCOUNT(*)FROMLogs t1 with(nolock)WHEREDATEDIFF(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

开发同事有一个脚本报错,很简单,简写如下:

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),则会返回一个错误。 对于?millisecondstartdate?与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'

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读