ADF从SQL Server拉取数据时datetime带T/Z如何转为常规格式
问题背景
执行SQL Server查询获取日期字段最大值:
select CONVERT(SMALLDATETIME, max(Date_U)) as Max_Date_U FROM [MDM].[C_CARD_RAWDATA]
- 直接在SQL Server环境执行返回结果:2022-03-22 15:51:00
- 通过ADF拉取结果赋值给变量时,获取到的值为:2022-03-22T15:51:00Z
需要将带T、Z标识的日期值转换为无特殊字母的常规datetime格式。
原因说明
ADF默认会将日期类型值序列化为ISO 8601标准格式:T是日期与时间的法定分隔符,Z标识该时间为UTC零时区时间,属于数据传输层的标准序列化行为,不是数据精度或内容错误。
可行解决方案
1. ADF侧格式化(推荐,不侵入原有SQL逻辑)
使用ADF内置的formatDateTime函数直接对变量做格式化输出:
@formatDateTime(variables('你的存储日期的变量名'), 'yyyy-MM-dd HH:mm:ss')
如果业务使用东八区等非UTC时区,先做时区转换再格式化,避免时间差问题:
@formatDateTime(convertFromUtc(variables('你的存储日期的变量名'), 'China Standard Time'), 'yyyy-MM-dd HH:mm:ss')
执行后直接输出2022-03-22 15:51:00格式的结果。
2. SQL侧直接返回固定格式字符串
修改查询语句,在SQL端直接将日期转为固定格式的字符串返回,从源头避免ADF的日期序列化逻辑:
select CONVERT(VARCHAR(19), max(Date_U), 120) as Max_Date_U FROM [MDM].[C_CARD_RAWDATA]
SQL Server的格式编码120对应的输出规则就是yyyy-MM-dd HH:mm:ss,返回结果为字符串类型,ADF拉取时不会做额外格式转换,直接拿到目标格式值。
3. 字符串替换法(适配固定格式场景)
如果确认拉取到的日期格式固定为yyyy-MM-ddTHH:mm:ssZ,可以直接替换掉特殊字符得到目标格式:
@replace(replace(variables('你的存储日期的变量名'), 'T', ' '), 'Z', '')
该方法实现简单,但如果日期值带毫秒、时区偏移后缀时容易出现格式错误,仅适合格式完全固定的场景使用。
内容的提问来源于stack exchange,提问作者KacperG
相关产品推荐
相关产品推荐

