Snowflake CSV文件格式处理时间戳异常问题求助
问题分析与解决方案
核心原因
你的文件格式中定义的TIMESTAMP_FORMAT = 'YYYY-MM-DDTHH:MI:SS.FFTZH'仅支持时区小时偏移格式(如+00),但CSV文件中的时间戳使用的是UTC缩写Z,两者格式不匹配导致解析失败。
而单独测试TO_TIMESTAMP_NTZ时能成功,是因为会话级参数TIMESTAMP_INPUT_FORMAT会自动兼容Z作为UTC的标识,但文件格式的TIMESTAMP_FORMAT是严格匹配模式,不会自动识别Z。
解决方法
方法1:修改文件格式的时间戳格式
更新文件格式,将TIMESTAMP_FORMAT改为支持Z的格式:
ALTER FILE FORMAT MY_DATABASE.MY_SCHEMA.assets_format SET TIMESTAMP_FORMAT = 'YYYY-MM-DDTHH:MI:SS.FFZ';
修改后可直接匹配CSV中的2022-08-11T00:00:00Z格式。
方法2:在COPY子查询中显式转换时间戳
如果不想修改文件格式,可在COPY的子查询中对时间戳列单独指定转换格式(将示例中的s.$10替换为实际时间戳所在的列位置):
COPY INTO MY_DATABASE.MY_SCHEMA.my_table FROM (SELECT s.$1, s.$2, s.$3, s.$4, s.$5, s.$6, s.$7, s.$8, s.$9 IF s.$9 IS NOT NULL ELSE '', TO_TIMESTAMP_NTZ(s.$10, 'YYYY-MM-DDTHH:MI:SS.FFZ'), s.$11, s.$12, s.$13, s.$14, s.$15, s.$16 FROM @MY_DATABASE.MY_SCHEMA.%my_table/Pdata s) FILE_FORMAT = ( FORMAT_NAME = 'MY_DATABASE.MY_SCHEMA.assets_format' ) PATTERN = '.*[.]csv[.]gz' PURGE = TRUE ON_ERROR = 'SKIP_FILE'
这种方式绕过文件格式的自动解析,直接显式处理带Z的时间戳。
额外检查点
- 确认COPY子查询中的列顺序与表的列顺序完全匹配,避免时间戳列被错误映射到非时间戳字段。
- 由于表中
last_updated_utc是NOT NULL,确保子查询中对应的时间戳列不会产生空值(若原数据有NULL,需替换为合法时间戳值,而非空字符串)。
内容的提问来源于stack exchange,提问作者Woody1193
相关产品推荐
相关产品推荐

