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

时间:2014-09-27 04:25:16

标签: sql-server postgresql talend

我有一个Talend作业,它在SQL Server数据库上运行查询,然后将所选数据写入Postgres数据库。我正在使用tMap组件进行映射。 SQL Server日期类似于2014-01-20 11:34:26.0(配置为'" yyyy-MM-dd HH:mm:ss.SSS"在Talend中)和Postgres日期yyyy-MM- DD

当我运行作业时,我得到以下异常:

  

[统计]连接
  批量输入0 INSERT INTO" criticalcareepisodes" ("给定名称"" FamilyName""高度""重量"" MRN"" id","录取日期")价值观(" 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日期类型有关 - 至少我是这么认为的。我相信我在这里遗漏了一些明显的东西,但是我们将不胜感激。

我添加了一些可能有用的图片: Job layout and SQL

tMap configuration

2 个答案:

答案 0 :(得分:2)

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

可以用字符串形式做类似的事情,即timestamp

为什么 Talend 软件发送的非字符串形式'2009-11-10 21:30:00.000000 +11:00'可能是该软件中的一个错误,尽管现有信息并不清楚。

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

请注意,这假设日志会正确分隔字符串,因为它们应该在timestamp查询中,这在日志中并不完全清楚(即 Adam Apple 字符串与否?如图所示,它们不是,但这很奇怪。

如果它们实际上是字符串,那么下一步就是准确得到异常,显然你需要调用INSERT来确定。

答案 1 :(得分:2)

Ken Hampson的answer涵盖了问题的Postgres部分:您正试图在日期字段中插入时间戳。

问题在于您尝试在架构中的日期类型配置的日期模式部分中指定预期格式(yyyy-MM-dd)。 Talend实际上始终保存完整日期对象,日期模式仅用于格式化目的,使用Talend组件(如tLogRow),然后以所选格式打印日期。

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