SQLServer The datediff function resulted in an overflow

本文探讨了在SQL中使用DATEDIFF函数时遇到的溢出问题,并提供了有效的解决方案。通过调整日期比较方式和修正异常数据,确保了查询的正确性和效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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,147,483,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, '2000-01-01 00:00:00', '2068-01-19 03:00:00') --2147482800

相差秒数为 2147482800,为 整型 int 的范围内。


也可以看看 datediff 返回的类型是什么:整型

SELECT SQL_VARIANT_PROPERTY(DATEDIFF(s, '2000-01-01 00:00:00', '2068-01-19 03:00:00'),'BaseType') 

所以,数据库存在了日期较大的值,这几行日期字段原本也是错误的数据,应该把日期改掉。还有就是语句写法也有问题,不应该这么写,应改成下面的写法更规范,否则即使有索引也不能使用!

SELECT	COUNT(*)
FROM	Logs t1 with(nolock)
WHERE	 t1.insertTime < '2016-08-18 17:06:35'



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值