如何将Netezza时间转换语句转为SQL Server函数适配IBM Cognos?
适配SQL Server的等价转换语句
针对你提供的Netezza时间转换逻辑,结合SQL Server语法和Cognos Framework Manager的兼容性,分两种场景给出等价实现:
场景1:POL.PERIOD_FROM_DATE是数字类型(存储为YYYYMMDDHH24MISSMS格式的数值)
原Netezza语句先将日期转成无格式的数字字符串,再解析为时间戳。在SQL Server中,我们需要先将数字转为字符串,再通过格式转换得到目标时间格式:
-- 转换为datetime2(1)类型,输出格式符合要求 CONVERT(datetime2(1), STUFF(STUFF(STUFF(STUFF(CAST(POL.PERIOD_FROM_DATE AS VARCHAR(17)), 9, 0, ' '), 12, 0, ':'), 15, 0, ':'), 18, 0, '.'), 121) AS EFFECTIVE_DATE
如果需要直接输出字符串格式的结果,可以再嵌套一层转换:
-- 直接输出指定格式的字符串 CONVERT(VARCHAR(23), CONVERT(datetime2(1), STUFF(STUFF(STUFF(STUFF(CAST(POL.PERIOD_FROM_DATE AS VARCHAR(17)), 9, 0, ' '), 12, 0, ':'), 15, 0, ':'), 18, 0, '.'), 121), 121) AS EFFECTIVE_DATE
场景2:POL.PERIOD_FROM_DATE是日期时间类型(如datetime、smalldatetime)
如果原字段本身就是日期时间类型,无需复杂的字符串转换,直接转换为datetime2(1)即可得到目标格式:
-- 直接转换为带1位毫秒的datetime2类型 CONVERT(datetime2(1), POL.PERIOD_FROM_DATE) AS EFFECTIVE_DATE
若要输出字符串格式,同样可以用CONVERT指定格式代码121:
-- 输出字符串格式的结果 CONVERT(VARCHAR(23), CONVERT(datetime2(1), POL.PERIOD_FROM_DATE), 121) AS EFFECTIVE_DATE
说明
datetime2(1)类型确保毫秒位只保留1位,符合你要求的2023-02-24 00:00:00.0格式- 格式代码
121对应SQL Server的yyyy-mm-dd hh:mi:ss.mmm(24h)格式,适配目标输出样式 - 以上语句均可直接在Cognos Framework Manager的数据源定义中使用
内容的提问来源于stack exchange,提问作者prudhvi
相关产品推荐
相关产品推荐

