今天在Sql Server中查询一段时间内的记录时,sql报出了如下错误:
两个 datetime 列的差别导致了运行时溢出。
测试后发现发生该问题的主要原因是因为两个datetime类型列计算的结果值超出了结果的数据类型的最大值或者最小值,最有可能就是在sql中使用了datediff函数了。
datediff返回的结果是int类型,也就是它的取值范围从–2^31 (-2,147,483,648) 到 2^31–1 (2,147,483,647)。如果我们计算的结果超出这个范围,就会报以上的错误了。
我们来做个测试,在datediff函数以s为单位来做示例,先计算一下超值范围,如果我们以秒为单位,那么计算的时间值只能在2,147,483,648/60/60/24/365=68年之间,如果超出68年,就会报错了。
测试:
select datediff(s,'1900-1-1','1968-1-1')
两个日期相差68年,不会报错,执行返回结果2145830400。
select datediff(s,'1900-1-1','1969-1-1')
两个日期相差69年,执行后返回错误:
两个 datetime 列的差别导致了运行时溢出。
总结:如果我们在做时间比较的时候不确定两个时间差的范围,就不要用datediff函数了,一不小心就报错了。YTK?P孴猒痵韹錝'