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

Sql server 使用Talend在SQL Server和Postgres之间转换日期,sql-server,postgresql,talend,Sql Server,Postgresql,Talend,我有一个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插入关键活动节点给定名称、家庭名称、身高、体重、mrn、id、批准日期值Adam、Apple、100200.0

我有一个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插入关键活动节点给定名称、家庭名称、身高、体重、mrn、id、批准日期值Adam、Apple、100200.0123456、下一个“关键活动节点id”2009-11-10 21:30:00.000000+11:00:00被中止。调用getNextException查看原因。 [统计]断开连接 2014年9月27日14时06分结束作业提取CriticalCarepisode。[退出代码=0]

似乎出于某种原因,日期的格式并不像我预期的那样。很明显,例外情况与试图将日期/时间推送到Postgres日期类型有关——至少我认为是这样。我确信我在这里遗漏了一些明显的东西,但任何帮助都将不胜感激

我添加了一些可能有帮助的图像:

我不熟悉Talend的软件,但从Postgres的角度来看,INSERT似乎试图使用非字符串文字2009-11-10 21:30:00.000000+11:00:00插入时间戳,这在Postgres中是无效的。除其他方法外,时间戳文本需要以字符串形式指定,但它不能是日志输出中指示的非字符串形式

人们可以用字符串形式做类似的事情,即“2009-11-1021:30:00.000000+11:00”

Talend软件为什么发送这样的非字符串形式的时间戳可能是该软件中的一个缺陷,尽管从可用信息中还不清楚

下面是一个例子,它更详细地说明了我的意思

请注意,这假设日志将正确地分隔字符串,因为它们应该在INSERT查询中,这在日志中并不完全清楚,即Adam和Apple字符串是否存在?如前所述,它们不是,但这很奇怪

如果它们实际上是字符串,那么下一步就是准确地获取异常是什么,这显然需要调用getNextException来确定。

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

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


要正确地将日期转换为格式化字符串,以便将其发送给Postgres,Postgres将隐式地将字符串转换为日期,您需要将row1.ccDateAllow替换为TalendDate.formatDateyyyy-MM-dd,row1.ccdateadmission.

你能发布一个工作的屏幕截图,包括数据库输出组件配置和模式吗?@ydaetskcoR我添加了几个图像。我希望这有帮助?抱歉,是的,它们是字符串-我修改了问题。感谢您提供了SQL示例。我实际上要做的是从MS SQL server获取日期时间类型,并在Postgres服务器上转换为仅日期而非时间组件。我想你是对的,Talend试图在日期中插入时间戳,但我不知道为什么。谢谢,这是一个很大的帮助!对于其他人,我添加了一个空测试row1.ccdateadmission==null?null:TalendDate.formatDateyyyy-MM-dd,row1.ccdateadmission