Snowflake技术咨询:如何将数据阶段中的日期(时间戳)插入到目标表中?
这个问题在处理格式不统一的CSV文件时太常见了!Snowflake的TIMESTAMPNTZ类型对输入格式一致性要求较高,而你的DATE字段同时存在DD-MM-YYYY HH24:MI:SS和DD-MM-YYYY两种格式,直接转换肯定会报错。
这里有个实用的解决方案,利用Snowflake的TRY_TO_TIMESTAMP_NTZ函数结合COALESCE来兼容两种格式,同时处理字段里的多余空格:
修正后的插入语句
INSERT INTO DBO.T_FILE(ID, "DATE", TEXT) SELECT $1, -- 先清理空格,再依次尝试两种格式转换 COALESCE( TRY_TO_TIMESTAMP_NTZ(TRIM($2), 'DD-MM-YYYY HH24:MI:SS'), TRY_TO_TIMESTAMP_NTZ(TRIM($2), 'DD-MM-YYYY') ) AS "DATE", $3 FROM @STG_FILE WHERE $3 <> '';
为什么这个方案有效?
TRIM($2):先去掉DATE字段前后的空格(比如第二行的16-06-2022末尾有空格),避免空格干扰格式解析。TRY_TO_TIMESTAMP_NTZ:和TO_TIMESTAMP_NTZ不同,它在转换失败时不会抛出错误,而是返回NULL,这样我们可以尝试多种格式。COALESCE:取第一个成功转换的结果,如果带时间的格式解析失败,就自动尝试仅日期的格式。
额外排查技巧
如果执行后还有部分行的DATE字段为NULL,说明存在其他未覆盖的格式,可以用下面的语句找出这些异常行,针对性处理:
SELECT $1 AS ID, $2 AS RAW_DATE, $3 AS TEXT FROM @STG_FILE WHERE COALESCE( TRY_TO_TIMESTAMP_NTZ(TRIM($2), 'DD-MM-YYYY HH24:MI:SS'), TRY_TO_TIMESTAMP_NTZ(TRIM($2), 'DD-MM-YYYY') ) IS NULL;
这样就能精准定位问题数据,确保导入的准确性啦!
内容的提问来源于stack exchange,提问作者Ser
相关产品推荐
相关产品推荐

