You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 07:45:29