pgsql 的 fdw 插件不能把 SQL Server 的 date 映射为 date?

问题现象

需要访问老系统中的 SQL Server,其中有个字段是 date 类型,本以为创建的外表也使用 date 就可以,实际上查询时报错:

SQL 错误 [22007]: ERROR: invalid input syntax for type date: "Apr 20 2020 12:00:00:AM"

SQL Server 中的日期数据是 2020-04-20,跟上面的格式也不一致。

问题分析

SQL Server 的 date 类型是 3 个字节,pgsql 的 date 类型是 2 个字节,理论上 mssql_fdw 应该会做转换的,实际上好像转换成了上述错误信息中的格式。

问题原因

可能是 mssql_fdw 有问题。

解决方法

按照 SQL Server and PostgreSQL Foreign Data Wrapper Configuration - Part 3,应该使用 varchar 或 text 来接收 date 等类型。

然后在代码里面将字符串转换为日期:

// 格式化 AM、PM 之类的日期,需要指定英文环境
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MMM dd yyyy hh:mm:ss:a", Locale.ENGLISH);
LocalDateTime dateTimeObj = LocalDateTime.from(formatter.parse("Apr 20 2020 10:00:00:PM"));

参考资料

SQL server Date 数据类型(分类、内置函数等)
pgsql 日期/时间类型
java 时间字符串中带 “AM“ 或 “PM“ 等指示上半天,下半天标识的解析
Java 日期格式模式
Java 8 日期、时间与格式化

posted @ 2022-09-25 17:40  ageovb  阅读(126)  评论(0编辑  收藏  举报