ADF数据流中无法将特定格式字符串转换为datetime/timestamp
解决ADLS CSV字符串转Timestamp并保留高精度插入SQL的问题
核心问题分析
你的源时间字符串是带7位小数的UTC格式(2022-07-24T07:04:27.5765591Z),之前转换失败是因为格式字符串与源格式不匹配,导致解析返回NULL。以下是两种场景的正确配置:
方案1:Projection中正确配置
在ADLS CSV源的Projection设置里,将列类型设为timestamp,并把格式字符串修改为匹配7位小数的版本:
yyyy-MM-dd'T'HH:mm:ss.SSSSSSS'Z'
SSSSSSS对应源字符串里的7位微秒部分,原来的SSS仅支持3位小数,无法解析更长的小数位,因此返回NULL。
方案2:Derived Column中正确使用toTimestamp
在Derived Column里使用完全匹配的格式表达式,注意ADF中需要用两个单引号''转义单引号:
toTimestamp(DataLakeModified_DateTime, 'yyyy-MM-dd''T''HH:mm:ss.SSSSSSS''Z''')
也可以利用时区占位符X直接匹配末尾的Z(UTC标识):
toTimestamp(DataLakeModified_DateTime, 'yyyy-MM-dd''T''HH:mm:ss.SSSSSSSX')
关键:SQL目标表的类型匹配
要确保SQL目标表的对应列类型支持7位精度,比如:
- SQL Server/Azure SQL DB 使用
datetime2(7) - PostgreSQL 使用
timestamp with time zone(或timestamptz)
只有这样才能完整保留源时间的7位小数精度,避免插入后精度丢失。
之前尝试失败的原因
- Projection里的格式
yyyy-MM-dd'T'HH:mm:ss.SSS'Z'仅支持3位小数,无法解析源字符串的7位小数部分,导致解析失败返回NULL。 - Derived Column里的表达式存在格式错误:
%Y-%m-%dT%H:%M:%s%z里的%s是错误占位符(应使用%S表示秒),且%z匹配±HHMM格式,不兼容末尾的Z。yyyy-MM-ddTHH:mm:ss:fffffffK里的小数部分用了冒号:,而源中是点.,格式不匹配。yyyy-MM-dd HH:mm:ss.SSS里的空格与源的T不匹配,且仅支持3位小数,导致解析失败。
内容的提问来源于stack exchange,提问作者Ajay
相关产品推荐
相关产品推荐

