如何解决ADF copy data活动中varchar转datetime的类型转换错误?
问题核心原因
- SQL Server 原生
datetime类型不支持带时区偏移的ISO 8601格式字符串,你遇到的2021-09-16T07:58:39.187+07:00这类带+hh:mm后缀的格式,只有datetimeoffset、datetime2(特定场景)可以兼容。 - ADF复制活动默认的类型转换逻辑不会自动适配带时区的时间字符串,即便你把目标字段类型修改为datetime2,也可能因为格式匹配规则不兼容触发转换失败。
可行解决方案
方案1:在ADF复制活动中添加转换逻辑
- 打开复制活动的映射标签页,找到
start__date列对应的映射规则 - 点击该列右侧的「添加动态内容」,根据业务需求选择对应表达式处理字符串:
- 若保留原时区的时间,直接截取时区前缀前的内容:
substring(item().start__date, 0, 23),处理后得到的2021-09-16T07:58:39.187格式字符串可直接转换为datetime/datetime2 - 若需要统一转换为UTC时间,使用表达式:
convertTimeZone(item().start__date, 'SE Asia Standard Time', 'UTC')(SE Asia Standard Time为UTC+7时区的标准ID)
- 若保留原时区的时间,直接截取时区前缀前的内容:
- 将映射后的目标列类型设置为
datetime2即可
方案2:在Staging层做SQL转换后迁移
- 先关闭ADF复制活动的自动类型转换,staging表的
start__date字段保留varchar类型 - 从staging表向目标表迁移时,使用SQL原生函数处理转换,示例代码:
-- 保留原时区时间转datetime2 SELECT CAST(LEFT(start__date, 23) AS datetime2) AS start__date FROM your_staging_table -- 转换为UTC时间后存储 SELECT CAST(SWITCHOFFSET(CAST(start__date AS datetimeoffset), 0) AS datetime2) AS start__date_utc FROM your_staging_table
该方案容错性更高,后续遇到异常格式的时间字符串时,可灵活添加校验、兼容逻辑。
方案3:修改目标表字段类型
如果业务需要保留原始时区信息,直接将目标表对应字段的类型修改为datetimeoffset,ADF默认转换即可成功,不需要额外处理字符串格式。
内容的提问来源于stack exchange,提问作者Daleman
相关产品推荐
相关产品推荐

