Datumsproblem bei Werten aus Oracle-DB

Hallo Leute

Ich habe gerade ein interessantes Problem und würde nur gern wissen, ob das jemand kennt bzw. ob es eine elegante Lösung dafür gibt.

Wir haben eine Oracle 10g-Datenbank, in der u.a. Personendaten mit Geburtsdatum abgelegt sind. Eine Java-Anwendung (Sun JRE 1.6) greift über den JDBC-Treiber von Oracle darauf zu.

Das Problem ist nun, dass bei allen Datumswerten zwischen dem 12.04.1945 und dem 18.11.1945 offenbar eine Stunde abgezogen wird. Aus dem Geburtsdatum „01.06.1945 00:00“ wird also „31.05.1945 23:00“. Oracle speichert immer Timestamps also Datum und Uhrzeit kombiniert. Folge: bei allen Personen, die in diesem Zeitraum geboren sind, wird ein falsches Geburtsdatum angezeigt.

Vermutlich betrifft das Problem auch alle anderen Datumsfelder, nur haben wir halt wenige Felder, in denen Daten, die älter als 20 Jahre sind, eingetragen werden.

Meine Vermutung ist, dass es irgendwie mit einer fehlerhaften Sommerzeit-Umrechnung zusammenhängt. Die Werte werden im Oracle-Client immer korrekt dargestellt, daher vermute ich das Problem entweder im JDBC-Treiber oder im Java selbst. Seltsam ist dabei nur, dass es wirklich nur das Jahr 1945 trifft.

Als Workaround kann ich natürlich bei allen betroffenen Geburtsdaten den Zeitanteil auf mind. 01:00 setzen - dann fällt es nicht auf, dass eine Stunde abgezogen wird, da die Zeit eh nicht angezeigt wird.

Es würde mich aber interessieren, ob jemand einen logische Erklärung für das Problem hat bzw. ob es eine „saubere“ Abhilfe für das Problem gibt.

ach ja - das Property „oracle.jdbc.V8Compatible=true“ ist gesetzt, da die Anwendung noch aus Oracle 7 Zeiten stammt.

lg
Erwin

Es würde mich aber interessieren, ob jemand einen logische
Erklärung für das Problem hat bzw. ob es eine „saubere“
Abhilfe für das Problem gibt.

Ich könnte mir vorstellen, dass dies ein Fehler in der Umrechnung von DATE in TIMESTAMP Datentypen ist, der durch das V8Compatible bedingt wird. Siehe hier:

http://www.oracle.com/technology/tech/java/sqlj_jdbc…

Dass der Fehler in Java liegt, halte ich für eher unwahrscheinlich, das wäre schon längst aufgefallen. Ich denke eher, dass der Fehler im JDBC-Treiber von Oracle liegt. Warum allerdings nur das Jahr 1945 betroffen ist, dafür habe ich auch keine Erklärung.

Eine sauberere Lösung wäre vielleicht, dass du dir in den Datenbank-Abfragen das Datum in ms seit 01.01.1970 umrechnen lässt. Das wäre dann ein einfacher Zahlenwert und würde keinen Konvertierungsfehlern unterliegen. In Java kannst du den dann ja ganz normal mit
new java.util.Date(long date)
in ein Datum umwandeln.

Zwar auch nicht wirklich schön, aber IMO zumindest schöner als auf die Daten 1 Stunde drauf zu rechnen. Denn letzteres könnte beim Umstieg auf einen neueren JDBC-Treiber, der das Problem nicht mehr hat, ja wieder Probleme geben, da dann ja die Daten wieder um 1 Stunde falsch wären.

hallo

habe eben versucht, das problem auf einem testsystem nachzustellen - kann es dort aber nicht reproduzieren, obwohl das testsystem dem produtionssystem sehr ähnlich ist (praktisch gleiche konfiguration der db und der java-vm). es ist also kein prinzipielles problem sondern muss irgendwie mit meiner konfiguration zusammenhängen.

die idee mit dem umrechnen auf sekunden ist zwar grundsätzlich ok - da die anwendung aber nicht selbstprogrammiert ist sondern zugekauft, habe ich da nicht wirklich viel einfluss darauf. die lösung mit der zusätzlichen stunde ist nicht so schlimm, da selbst dann, wenn der fehler nicht mehr auftritt (also keine stunde abgezogen wird) der datumsteil immer noch der selbe ist - und beim geburtsdatum wird in der maske eh nur der datumsteil angezeigt und nicht der uhrzeitteil. von da her sehe ich also weniger risiko als bei der umstellung des programmcodes.

eine mögliche erklärung hätte ich noch: auf die db greift ein serverprozess zu, der client verbindet sich mittels rmi auf den server. in der vergangenheit hatten wir ähnliche probleme mit dem datum, weil der client vermutete, dass er in deutschland steht (windows gibt bei der zeitzonen-info eine reihe von städten an und die erste davon ist berlin), der server wusste aber, dass er in österreich steht. wir haben darauf den client explizit mitgeteilt, dass er in wien/österreich steht (user.timezone=Europe/Vienna). seitdem hats meist geklappt.

vielleicht gibts da irgendwo immer noch ein zeitzonenproblem. ev. glaubt irgendein teil der kette, dass österreich und deutschland nach dem 2. weltkrieg unterschiedliche regelungen für die sommerzeit hatten und rechnet die timestamp-werte entsprechend um. der prod-server läuft unter java 1.6.0_14, der client unter java 1.6.0_11, der testserver unter java 1.6.0_06. ich probier mal, die java-versionen der server anzugleichen und schaue dann, ob das problem dann reproduzierbar ist.

lg
erwin