SQLServer datetime2转PostgreSQL timestamp报错求助
解决SQLServer datetime2转PostgreSQL timestamp的格式问题
问题核心
SQLServer的datetime2字段经dbt传递到PostgreSQL时,被转换为英文月缩写格式的字符串(如Mar 17 2021 08:21:19:0000000AM),导致PostgreSQL无法识别为合法的timestamp类型。
可行解决方案
方案1:SQLServer端预转换为ISO标准格式
在dbt的源查询中,直接在SQLServer侧将datetime2字段转为ISO标准的字符串格式,PostgreSQL可直接解析为timestamp:
SELECT CONVERT(VARCHAR(30), date_debut, 126) AS date_debut FROM your_sqlserver_source_table
CONVERT的126参数对应格式为YYYY-MM-DDTHH:MM:SS.FFFFFFF,属于PostgreSQL原生支持的timestamp输入格式,后续可直接用date_debut::timestamp转换,且不影响时间差计算。
方案2:PostgreSQL端匹配错误格式进行转换
针对实际传入的英文月缩写格式,使用正确的格式串调用TO_TIMESTAMP:
TO_TIMESTAMP(date_debut, 'Mon DD YYYY HH:MI:SS:FF7AM')::timestamp
格式串说明:
Mon:匹配英文月份缩写(如Mar、Oct)DD:两位日期YYYY:四位年份HH:12小时制小时数MI:分钟SS:秒FF7:7位微秒(对应datetime2(7)的精度)AM:匹配上午/下午标识
方案3:调整dbt适配器配置避免字符串转换
检查dbt的SQLServer适配器配置,在dbt_project.yml的数据源配置或profile文件中,确认是否存在类型映射参数,强制将datetime2字段以原生时间类型传递给PostgreSQL,跳过中间的字符串转换环节,从根源避免格式问题。
验证
使用上述任一方案转换后,即可正常执行时间差计算(如end_time - start_time),同时不会触发格式报错。
内容的提问来源于stack exchange,提问作者amandine deraedt
相关产品推荐
相关产品推荐

