通过Talend从Oracle导入的MongoDB日期是1天

时间:2016-01-06 18:11:43

标签: oracle mongodb talend isodate

我实际上是通过tLibraryLoad组件使用mongDB API,因为我发现使用tJavaRow和tJava组件比使用MongoDB调色板组件更容易构建复杂的多级文档。

我正在读取来自Oracle的数据,这些数据是具有零时间戳组件的日期值:例如:

  

29-JUN-08 00.00.00

导入通过Talend工作,但是mongo shell中的记录似乎是前一天。您可以看到记录插入为28-JUN-2008。

从mongoDB中的JSON文档中提取:

  

" status_date" :ISODate(" 2008-06-28T23:00:00Z")

几乎就像mongoDB(或Talend?)将午夜日期视为前一天的结束,而不是2008年6月29日的开始。

在我的Talend模式中,我已将Oracle列指定为Date类型,并且DB类型为Date。

任何建议表示赞赏。

---更新1 ------ 由于只有一些日期受到影响,似乎这是mongoDB中的DST调整,可能会将显示调整为我当地的时区,因为受影响的日期在夏令时的后半段。

是否因为mongo shell的位置而调整日期?

由于mongo服务器的位置,它正在调整日期,所以使用mongo shell的所有人都会得到相同的日期查询答案?

不同的人在日期上运行不同的mongo查询会根据他们的位置得到不同的结果,他们的DST启动日期...即。你可以想象2015年11月1日的日期,被计算为10月31日的数字(23:00)......

2 个答案:

答案 0 :(得分:1)

我感觉到你的痛苦 - 这是来自MongoDB本身。

问题在于MongoDB默认以UTC格式存储日期。

https://docs.mongodb.org/manual/tutorial/model-time-data/

您可以使用上面的Mongo建议,但在这种情况下,您只存储日期而不是时间。我使用了两种解决方案:

  1. 不要将日期存储为DATE。将所有日期转换为%Y%m%d格式并将它们存储为整数。您只需使用整数就可以使用$ gt和$ lte轻松比较日期 - 只需确保使用相同的格式引入日期,然后在程序中将其转换回来。
  2. ......或......

    1. 因为在您的情况下,您的日期似乎已经过了一个小时,所以在您插入之前加一小时。这一切都取决于时区偏移到本地计算机的时间长度。
    2. 在Linux上,您可以看到utc值的用途:

      date -u
      

      我想您可以将计算机上的本地时区更改为UTC时间,看看会发生什么。

      就个人而言,我从未遇到过使用第一种方法的问题。这很快,并确保我有我想要的东西。

答案 1 :(得分:0)

我认为这是因为服务器的时区。尝试从日期对象中删除时区,然后将其插入mongodb。

使用moment.js,你可以用这样的方式创建没有时区的日期:

var date = moment.utc("29-JUN-08 00.00.00", 'DD-MM-YYYY h.mm.s').format()