Datum („Date“)
Wenn beispielsweise eine Datenbank ein Datum als 2021-03-10 Midnight (10.03.2021 Mitternacht) zurückgibt, die andere Datenbank diese Datumsangabe jedoch als 2021-03-10 Midnight in Central Europe GMT+2 (10.03.2021 Mitternacht in Mitteleuropa GMT+2) verarbeitet, wird das Datum zur Speicherung in UTC konvertiert und in einen Datumstyp umgewandelt, woraus sich nach der Ingestion das Datum 2021-03-09 (09.03.2021) ergibt. Das wird in vielen Fällen als Bug interpretiert, wobei es eine logische Erklärung dafür gibt.
Die Datenbank speichert das Objekt als 2021-03-10 (10.03.2021).
Das Objekt wird an Java übergeben und wird dann (je nach verwendeter Konvertierung) zu:
- 2021-03-10 00:00:00.000 UTC
- 2021-03-10 02:00:00.000 GMT+2
Anschließend erfolgt die Übergabe an die Datenbank, die das Datum folgendermaßen verarbeitet:
- 2021-03-10 00:00:00.000 GMT+2
- 2021-03-09 22:00:00.000 UTC
Durch die Konvertierung in UTC wird das Datum um einen Tag vorverlegt. Wenn Sie demzufolge datumsbezogene Probleme antreffen, sollten Sie stets das gesamte Datum analysieren, d. h. einschließlich Zeitzone, Stunden und Sekunden.
Genauigkeit
Da Talend java.util.Date verwendet, ist keine Mikro- und Nanosekunden-Genauigkeit verfügbar. Allerdings prüfen einige Komponenten ggf., ob es sich bei dem eingehenden Objekttyp um java.sql.Timestamp handelt. In diesem Fall sind ebenfalls Nanosekunden verfügbar. Um dies nutzen zu können, müssen Sie den Objekttyp („Object“) in der Schemadefinition auswählen, wobei das von den Quell- und Zielkomponenten unterstützt werden muss.
Experimentelle Ausführung
Zur Behebung von Problemen können Sie Folgendes versuchen:
- Verwenden Sie eine tFileOutput-Komponente, um die Werte zu extrahieren und zu lesen. Auf diese Weise haben Sie die Zeitzone besser im Griff.
- Verwenden Sie den Parameter -Duser.timezone, um zu ermitteln, ob sich dadurch das Verhalten ändert. Weitere Informationen finden Sie unter „Zeitzoneneinstellungen in JRE“.
- In der Dokumentation des JDBC-Treibers finden Sie Informationen zur Handhabung dieser Zeitzonen.
- Verwenden Sie eine tLogRow-Komponente mit folgendem Muster und Ergebnis:
"yyyy-MM-dd'T'HH:mm:ss.SSSXXX" 2001-07-04T12:08:56.235-07:00
Die Zieldatenbank ist dann unter Umständen in der Lage, den mit der Zeitzone verknüpften Zeitstempelteil der vorherigen Beispiele zu speichern. Das könnte eine Datumsverschiebung zur Folge haben.
Mögliche Workarounds
Verwenden Sie Zeichenfolgen (Strings), um zu ermitteln, ob die Datenbank bzw. die zugehörigen Treiber die Transformation verarbeiten können. Bei Zeichenfolgen gilt das WYSIWYG-Prinzip (Echtzeitdarstellung), d. h. es gibt keine zusätzlichen verborgenen Informationen.
Konvertierung zwischen Zeitzonen mit Java-Code in einer tJavaRow-Komponente:
String pattern = "yyyy-MM-dd";
log.info(TalendDate.formatDate(pattern, input_row.startDate));
output_row.startDateUTC = TalendDate.parseDateInUTC("yyyy-MM-dd zzz",
TalendDate.formatDate("yyyy-MM-dd", input_row.startDate)+" UTC");Weitere Informationen zum Verhalten des Datumstyps finden Sie unter Denkfehler in Verbindung mit Kalenderdaten....