通过ADF加载DD-MM-YYYY格式时间戳至Snowflake的方案咨询
Snowflake 非默认格式时间戳加载解决方案
你可以任选以下三种方案解决格式不匹配问题,不需要强制适配Snowflake默认时间戳格式:
方案1:表字段直接用时间戳类型,加载时指定输入格式
无需把时间戳字段存为VARCHAR,直接使用TIMESTAMP_NTZ(无时区需求选这个,也可按需替换为TIMESTAMP_TZ/TIMESTAMP_LTZ)类型即可,Snowflake支持自定义输入解析格式。
- 调整后表DDL示例:
create or replace table trial1 ( name varchar(100), t varchar(100), t1 TIMESTAMP_NTZ );
- 两种加载适配方式:
- 如果用ADF调用
COPY命令从阶段加载文件,直接在文件格式参数中指定时间戳格式即可:
COPY INTO trial1 FROM @你的阶段路径/源文件.csv FILE_FORMAT = ( TYPE = CSV TIMESTAMP_FORMAT = 'DD-MM-YYYY HH24:MI:SS' );- 如果是ADF逐行插入数据,插入时用
TO_TIMESTAMP转义即可:
INSERT INTO trial1 VALUES ('ABCD', '1000', TO_TIMESTAMP('09-10-2021 18:20:55', 'DD-MM-YYYY HH24:MI:SS')); - 如果用ADF调用
按以上配置操作后,直接查询t1字段默认输出就是YYYY-MM-DD HH24:MI:SS格式,无需额外转义。
方案2:修改会话级时间戳输入格式(适配批量加载场景)
如果批量导入的源文件都是DD-MM-YYYY HH24:MI:SS格式,可以在ADF连接Snowflake的会话初始化参数中添加以下语句,后续整个会话的时间戳输入都会按该格式自动解析,不需要每个写入操作单独加转义函数:
ALTER SESSION SET TIMESTAMP_INPUT_FORMAT = 'DD-MM-YYYY HH24:MI:SS';
方案3:ADF侧提前完成格式转换
如果不想修改Snowflake侧任何配置,可在ADF数据流中添加派生列组件,把源时间戳字符串提前转换为yyyy-MM-dd HH:mm:ss格式后再写入Snowflake,完全适配Snowflake默认解析规则。
原有查询语句修正说明
你之前使用TO_DATE转义带时分秒的时间戳会丢失时间部分,要保留完整时间信息需要用TO_TIMESTAMP,修正后写法如下:
SELECT TO_VARCHAR(TO_TIMESTAMP(t1,'DD-MM-YYYY HH24:MI:SS'),'YYYY-MM-DD HH24:MI:SS.FF') from trial1;
内容的提问来源于stack exchange,提问作者Coder1990
相关产品推荐
相关产品推荐

