Informix迁移至MS SQL Server时含::的时间差SQL语法改写方法
Informix到SQL Server的时间差计算语句迁移
原Informix语法逻辑说明
Informix中的双冒号::是强制类型转换运算符,执行逻辑为从左到右依次将左侧值转换为::后指定的类型,等价于SQL Server中的CAST/CONVERT函数。
原代码逐段执行逻辑如下:
round((GETDATE() - max(l105.dataen))::interval second(9) to second::char(10)::int / 60 / 60, 3)
GETDATE() - max(l105.dataen):计算当前系统时间与l105表中dataen字段最大值的时间差,Informix中两个datetime类型值直接相减会返回interval类型的时间间隔结果::interval second(9) to second:将时间间隔转换为精度9位的秒级间隔,即把时间差折算为总秒数形式,丢弃秒以下的时间精度::char(10):将秒级间隔值转换为长度10的字符串::int:将存储总秒数的字符串转换为整数类型- 后续计算:总秒数连续除以60换算为小时值,最终通过
round函数保留3位小数,最终输出结果为当前时间距离l105表最大dataen时间的间隔小时数,保留3位小数
MS SQL Server 等价实现
SQL Server没有Informix的interval类型直接转换语法,直接使用内置日期差函数即可实现完全一致的逻辑,推荐通用写法:
ROUND( DATEDIFF(SECOND, MAX(l105.dataen), GETDATE()) / 60.0 / 60.0, 3 )
注意:除数必须写为
60.0而非整数60,否则SQL Server会执行整数除法截断小数部分,导致计算结果与原Informix逻辑不符。
如果使用SQL Server 2016及以上版本,当时间差可能超过68年(对应秒数超过int类型上限)时,可以使用大整数版本的日期差函数避免溢出:
ROUND( DATEDIFF_BIG(SECOND, MAX(l105.dataen), GETDATE()) / 60.0 / 60.0, 3 )
内容的提问来源于stack exchange,提问作者kuy
相关产品推荐
相关产品推荐

