Импорт данных MongoDB через Talend из Oracle отложен на 1 день

На самом деле я использую API mongDB через компонент tLibraryLoad, так как мне проще создавать сложные многоуровневые документы с использованием компонентов tJavaRow и tJava, чем с использованием компонентов палитры MongoDB.

Я читаю данные из Oracle, которые представляют собой значения даты с нулевым компонентом отметки времени: например:

29 ИЮНЯ 08 00.00.00

Импорт работает через Talend, однако записи в оболочке mongo появляются за предыдущий день. Вы можете видеть, что запись вставлена ​​как 28-JUN-2008.

Выдержка из документа JSON в mongoDB:

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

Это похоже на то, как если бы mongoDB (или Talend?) воспринимал полночь как конец предыдущего дня, а не как начало 29 июня 2008 года.

В моей схеме Talend я указал столбцы Oracle как типы даты с типом даты БД.

Любые советы приветствуются.

--- ОБНОВЛЕНИЕ 1 ------ Поскольку затронуты только некоторые даты, кажется, что это настройка летнего времени в mongoDB, чтобы настроить отображение на мой местный часовой пояс, поскольку затронутые даты находятся в задней половине год по летнему времени.

Корректирует ли дату из-за расположения оболочки монго?

Он корректирует дату из-за местоположения сервера монго, чтобы все люди, использующие оболочку монго, получали одинаковые ответы на запросы даты?

Будут ли разные люди, выполняющие разные запросы монго по датам, получать разные результаты в зависимости от их местоположения, даты их перехода на летнее время... т.е. вы можете себе представить даты с 1 ноября 2015 года, которые учитываются как вклад в цифры на 31 октября (в 23:00)....

i


person smackenzie    schedule 06.01.2016    source источник


Ответы (2)


Я чувствую вашу боль - это происходит от самой MongoDB.

Проблема в том, что MongoDB по умолчанию хранит даты в формате UTC.

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

Вы можете использовать предложение Монго выше, но в этом случае вы сохраняете только дату, а не время. Я использовал два решения:

  1. Не утруждайте себя сохранением дат как DATE. Преобразуйте все свои даты в формат %Y%m%d и сохраните их как целые числа. Вы можете легко сравнивать даты, используя $gt и $lte, просто используя целые числа - просто не забудьте ввести дату в том же формате и позже преобразовать ее обратно в свою программу.

... or ...

  1. Поскольку в вашем случае ваша дата, кажется, смещена на час, добавьте к ней час, прежде чем вставлять. Все зависит от того, насколько велико смещение часового пояса на вашем локальном компьютере.

В Linux вы можете увидеть, что использует значение utc:

date -u

Я полагаю, вы могли бы изменить свой локальный часовой пояс на своем компьютере на время UTC и посмотреть, что произойдет.

Лично у меня никогда не было проблем с использованием первого подхода. Это быстро и гарантирует, что у меня есть то, что я хочу.

person APerlman    schedule 06.01.2016
comment
Привет спасибо. где срабатывает часовой пояс? Это в Оракле? Моя работа Talend выполняется локально на моем ноутбуке, который находится в часовом поясе UTC UK (+00 часов)? Мне нужно выполнять любые преобразования дат с использованием java-библиотек, поскольку я использую компонент tJavaRow и java-API mongoDB. В Oracle я сохраняю дату, а не временную метку с часовым поясом. - person smackenzie; 06.01.2016

Я думаю, это из-за часового пояса вашего сервера. Попробуйте удалить часовой пояс из объекта даты, а затем вставьте его в файл mongodb.

С moment.js вы можете создать дату без часового пояса следующим образом:

var date = moment.utc("29-JUN-08 00.00.00", 'DD-MM-YYYY h.mm.s').format()
person Volodymyr Synytskyi    schedule 06.01.2016
comment
привет, мой единственный вариант - использовать java API, а не javascript в Talend, я думаю. Я понимаю, как часовой пояс сервера будет корректировать вызов sysdate, но как это повлияет на запись сохраненного значения, считываемого из Oracle? - person smackenzie; 06.01.2016