使用 Talend 在 SQL Server 和 Postgres 之间转换日期
Posted
技术标签:
【中文标题】使用 Talend 在 SQL Server 和 Postgres 之间转换日期【英文标题】:Converting dates between SQL Server and Postgres with Talend 【发布时间】:2014-09-27 04:25:15 【问题描述】:我有一个 Talend 作业,它在 SQL Server 数据库上运行查询,然后将选定的数据写入 Postgres 数据库。我正在使用 tMap 组件进行映射。 SQL Server 日期类似于 2014-01-20 11:34:26.0
(在 Talend 中配置为 '"yyyy-MM-dd HH:mm:ss.SSS")和 Postgres 日期 yyyy-MM-dd。
当我运行作业时,出现以下异常:
[统计]已连接 批处理条目 0 INSERT INTO "criticalcareepisodes" ("GivenName","FamilyName","height","weight","mrn","id","admissiondate") VALUES ("Adam","Apple",100,200.0,123456 ,nextval('CriticalCareEpisodes_id_seq'),2009-11-10 21:30:00.000000 +11:00:00) 被中止。调用 getNextException 查看原因。 [统计] 断线 Job ExtractSLICCriticalCareEpisode 于 2014 年 9 月 27 日 14:06 结束。 [退出代码=0]
似乎由于某种原因,日期的格式没有像我预期的那样。该异常显然与尝试将日期/时间推入 Postgres 日期类型有关——至少我是这么认为的。我确信我在这里遗漏了一些明显的东西,但我们将不胜感激。
我添加了一些可能有帮助的图片:
【问题讨论】:
您能否发布您的工作截图,包括数据库输出组件配置和架构? @ydaetskcoR 我添加了几张图片。我希望这会有所帮助? 【参考方案1】:Ken Hampson 的 answer 涵盖了问题的 Postgres 部分:您正试图将时间戳插入日期字段。
问题是您试图在架构中日期类型配置的日期模式部分中指定预期格式 (yyyy-MM-dd)。 Talend 实际上始终保存完整的日期对象,日期模式仅用于格式化目的,使用 Talend 组件(例如 tLogRow)然后以所选格式打印日期。
要将日期正确转换为格式化字符串,以便将其发送到 Postgres(这会将字符串隐式转换为日期),您需要将 row1.CCDateAdmit
替换为 TalendDate.formatDate("yyyy-MM-dd",row1.CCDateAdmit)
。
【讨论】:
谢谢 - 这是一个很大的帮助!对于其他人,我添加了一个空测试 row1.CCDateAdmit==null?null:TalendDate.formatDate("yyyy-MM-dd",row1.CCDateAdmit)【参考方案2】:我不熟悉 Talend 的软件,但从 Postgres 的角度来看,INSERT
似乎正在尝试插入 timestamp
使用非字符串文字 2009-11-10 21:30:00.000000 +11:00:00,这在 Postgres 中是无效的。 timestamp
字面量需要以字符串形式指定(除其他方法外,但不能像日志输出中指示的那样是非字符串形式)。
可以以字符串形式执行类似的操作,即'2009-11-10 21:30:00.000000 +11:00'
。
为什么 Talend 软件会发送类似 timestamp
的非字符串形式,这可能是该软件中的一个错误,尽管从可用信息中并不清楚。
这是一个sqlfiddle,它更详细地说明了我的意思。
请注意,这假设日志将正确分隔字符串,因为它们应该在 INSERT
查询中,这在日志中并不完全清楚(即 Adam 和 Apple 字符串与否?如前所述,它们不是,但这很奇怪。
如果它们实际上是字符串,那么下一步就是准确了解异常是什么,显然您需要调用getNextException
来确定。
【讨论】:
抱歉,是的,它们是字符串 - 我已经修改了问题。感谢您提供 SQL 示例。我实际上想要做的是从 MS SQL 服务器获取日期时间类型,并在 Postgres 服务器上转换为仅日期(不是时间组件)。我认为 Talend 试图在日期中插入时间戳是正确的 - 但我不知道为什么。以上是关于使用 Talend 在 SQL Server 和 Postgres 之间转换日期的主要内容,如果未能解决你的问题,请参考以下文章