在Talend之间转换SQL Server和Postgres之间的日期

问题描述:

我有一个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。在Talend之间转换SQL Server和Postgres之间的日期

当我跑我得到下面的异常工作:

[统计]连接
批量录入0 INSERT INTO “criticalcareepisodes”( “给定名称”, “FamilyName”, “身高”,“体重VALUE(“Adam”,“Apple”,100,200.0,123456,nextval('CriticalCareEpisodes_id_seq'),2009-11-10 21:30:00.000000 +11:00: 00)被中止。调用getNextException来查看原因。
[统计]断开连接
作业ExtractSLICCriticalCareEpisode于2014年9月27日14:06结束。 [退出代码= 0]

看来,由于某种原因,日期没有按照我的预期格式化。这个例外与尝试将日期/时间推入Postgres日期类型显然有关 - 至少我认为是这样。我相信我在这里错过了一些明显的东西,但任何援助将不胜感激。

我增加了一些图片,可以帮助: Job layout and SQL

tMap configuration

+0

您可以发布您的工作的截图包括数据库输出组件配置和架构? – ydaetskcoR 2014-09-27 07:39:08

+0

@ydaetskcoR我添加了几个图像。我希望这有帮助? – skyman 2014-09-27 12:31:58

肯·汉普森的answer盖Postgres问题的一部分:你试图插入将时间戳记写入日期字段。

的问题是,你要指定架构中的日期类型结构的日图形部分预期的格式(YYYY-MM-DD)。 Talend实际上始终保存完整日期对象,日期模式仅用于格式化Talend组件,例如tLogRow,然后将以所选格式打印日期。

要正确地将日期转换为格式化的字符串,以便您可以将其发送到Postgres(它将隐式地将字符串转换为日期),您需要用TalendDate.formatDate("yyyy-MM-dd",row1.CCDateAdmit)替换row1.CCDateAdmit

+1

谢谢 - 这是一个很好的帮助!对于其他人,我添加了空测试row1.CCDateAdmit == null?null:TalendDate.formatDate(“yyyy-MM-dd”,row1.CCDateAdmit) – skyman 2014-09-28 00:15:11

我不熟悉了Talend的软件,但是,从的Postgres的角度看,它看起来像INSERT试图插入timestamp使用非字符串字面2009-11-10 21:30:00.000000 +11:00:00,这不是中的有效做法Postgrestimestamp文字需要以字符串形式指定(在其他方法中,但它不能像日志输出中指示的那样是非字符串形式)。

人们可以做一些类似的字符串形式,即'2009-11-10 21:30:00.000000 +11:00'

为什么拓蓝软件发送一个非字符串形式timestamp一样,可能是在软件中的错误,虽然它不是从现有资料清楚。

这是一个sqlfiddle,它更详细地显示了我的意思。

注意,这个假设日志将适当分隔字符串,因为他们应该在INSERT查询,这是不是从日志完全清楚(即是亚当苹果字符串或不是?如图所示,他们都没有,但是这是奇怪的。

如果他们实际上是字符串,那么下一步就是要得到完全的例外是什么,这显然需要调用getNextException确定。

+0

道歉,是的,他们是字符串 - 我修改了这个问题。感谢您的SQL示例。我实际上试图做的是从MS SQL服务器中获取日期时间类型,并将其转换为Postgres服务器上的仅日期(而非时间组件)。我认为你是正确的,Talend试图在时间上插入时间戳 - 但我不知道为什么。 – skyman 2014-09-27 13:00:48