2016-01-06 52 views
0

我實際上通過tLibraryLoad組件使用mongDB API,因爲我發現使用tJavaRow和tJava組件比使用MongoDB調色板更容易構建複雜的多級文檔組件。通過Talend從Oracle導入的MongoDB日期已經過去1天

我讀在從Oracle其是具有零時間戳部分日期值的數據:通過了Talend

29-JUN-08 00.00.00

導入工作:例如但是,mongo shell中的記錄似乎是前一天。您可以看到該記錄插入爲2008年6月28日。從JSON文檔

提取MongoDB中:

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

這幾乎是彷彿MongoDB的(或拓藍?)將午夜日期視爲前一天的結束,而不是2008年6月29日的開始。

在我的Talend架構中,我還將Oracle列指定爲具有日期類型的日期類型。

任何意見讚賞。

---更新1 ------ 由於只有一些日期受到影響,似乎這是mongoDB中的DST調整,可能會將顯示調整爲我當地的時區,因爲受影響的日期是在夏令時的後半部分。

是否由於mongo shell的位置而調整日期?

由於mongo服務器的位置,它正在調整日期,所以所有使用mongo shell的人都會得到與日期查詢相同的答案?

不同的人在日期上運行不同的mongo查詢會根據他們的位置得到不同的結果,他們的DST踢日期......即,你可以從2015年11月1日想像日期,被視爲促進10月31日的數字(23:00)....

回答

0

我想這是因爲你的服務器的時區。嘗試從日期對象中刪除時區,然後將其插入到mongodb中。

隨着moment.js可以不用在這種方式的時區創建日期:

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

嗨,我唯一的選擇是使用java api,而不是在Talend內的javascript,我想。我瞭解服務器的時區如何調整sysdate調用,但是它會如何影響從Oracle讀取的存儲值的寫入? – smackenzie

1

我覺得你的痛苦 - 這是從MongoDB的本身產生。

問題在於,MongoDB默認以UTC格式存儲日期。

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

您可以使用蒙戈的建議之上,但在這種情況下,你只是存儲的日期,而不是時間。我使用了兩種解決方案:

  1. 不要打擾存儲日期作爲日期。將所有日期轉換爲%Y%m%d格式並將它們存儲爲整數。使用$ gt和$ lte只需使用整數即可輕鬆比較日期 - 只需確保使用相同的格式導入日期,然後再將其轉換回日後的程序。

......或者......

  • 因爲你的情況你的約會似乎一小時處於關閉狀態,你讓你插​​入之前增加一個小時,將其。這一切都取決於時區偏移到本地機器的時間。
  • 在Linux上,你可以看到什麼UTC值使用:

    date -u 
    

    我想你可以改變你的機器上的本地時區是UTC時間,看看會發生什麼。

    個人而言,我從來沒有使用第一種方法的問題。速度很快,並確保我擁有我想要的內容。

    +0

    嗨,謝謝。踢的時區在哪裏?它在Oracle嗎?我的Talend工作在我的筆記本電腦本地運行,這是UTC時區英國(+00小時)?我需要使用java庫進行任何日期轉換,因爲我使用tJavaRow組件和mongoDB java API。在Oracle中,我將日期和時區一起存儲爲時間戳。 – smackenzie