2 Stimmen

Ändert die Java-Umgebung den Wert des Parameters NLS_DATE_FORMAT?

Ich habe einen Unix- und einen Linux-Server, die jeweils als Datenbank- und Anwendungsserver verwendet werden. Die Datenbank ist Oracle 10g und der Anwendungsserver ist Weblogic 9.3 MP3 mit installiertem jRockit 1.5. Ich habe einen Verbindungspool in Weblogic Server erstellt.

Ich habe versucht, NLS_DATE_FORMAT aus den Tabellen NLS_DATABASE_PARAMETERS, NLS_SESSION_PARAMETERS und NLS_INSTANCE_PARAMETERS auf vier verschiedene Arten zu lesen.

  1. Die Verwendung von sqlplus zeigt wie erwartet DD-MON-YYYY für alle an.
  2. Eine Verbindung vom Pool in meiner Webanwendung zeigt die NLS_SESSION_PARAMETERS-Tabelle als DD-MON-RR, und der Rest der Tabelle zeigt DD-MON-YYYY.
  3. Ein eigenständiges Java-Programm, das die Datenbankverbindung direkt herstellt, führt zum gleichen Ergebnis wie in (3).
  4. Wenn ich das gleiche Programm auf meinem PC ausführe, zeigt es das gleiche Ergebnis wie in (1), d.h. DD-MON-JJJJ für alle.

Ich habe weder NLS_LANG noch NLS_DATE_FORMAT in irgendeiner (auf dem Datenbankserver, dem Anwendungsserver oder dem PC) meiner Umgebung eingestellt. Die init.ora hat die Einstellung DD-MON-YYYY.

Was also macht NLS_DATE_FORMAT anders, wenn durch Java-Code auf dem Server zu tun.

4voto

Jon Skeet Punkte 1325502

Es ist schwer zu sagen, was los ist, ohne einen Teil Ihres Codes zu sehen, aber Sie sollten sich nicht auf das Datumsformat in der Datenbank verlassen. Sie sollten Datum/Zeitstempelwerte als Objekte abrufen - Sie können sie dann formatieren, wie Sie wollen. Im Grunde speichern Sie keine Zeichenkette, sondern ein Datum oder einen Zeitstempel. Ein Datum, das ich natürlich als "19/06/1976" schreibe, könnte von jemand anderem als "06-19-1976" geschrieben werden - aber beide stellen das gleiche Datum dar.

Das ist so, als würde man fragen, ob die Datenbanken ganze Zahlen in Hexadezimal- oder Dezimalschreibweise speichern: Sie tun weder das eine noch das andere, soweit es uns interessieren sollte: Sie speichern die ganzen Zahlen selbst. Behandeln Sie Zahlen als Zahlen, Daten als Daten, Zeitstempel als Zeitstempel usw., und wenn Sie dem Benutzer etwas anzeigen wollen, wählen Sie das für ihn am besten geeignete Format.

1voto

a_horse_with_no_name Punkte 489934

Soweit ich weiß, passt der JDBC-Treiber die NLS-Einstellungen an die Systemeigenschaften von Java an. user.locale eingestellt ist.

Es besteht also höchstwahrscheinlich ein Unterschied zwischen der Gebietsschemaeinstellung des Anwendungsservers und Ihrem lokalen PC.

0voto

APC Punkte 140727

"die Tabelle NLS_SESSION_PARAMETERS zeigt es als DD-MON-RR"

Dieses Format ist, oder sollte zumindest, veraltet sein. Es wurde in den späten neunziger Jahren als Notlösung für Jahr-2000-Probleme eingeführt. Sein Zweck ist es, ein Jahrhundert an Daten anzuhängen, die nur als JJ eingegeben werden. Es verwendet einen Fenster-Algorithmus, um zu entscheiden, ob das YY ein Jahrhundert von 19 oder 20 benötigt. Der Drehpunkt ist fest - 49 -, so daß die Zuordnungen mit fortschreitendem Kalender immer unbefriedigender werden.

Die Tatsache, dass Sie Daten von 0011 anstelle von 2011 erhalten, deutet darauf hin, dass Sie ein laufendes Jahr-2000-Problem haben. Platz ist kein Problem mehr. Es gibt wirklich keine Entschuldigung dafür, nicht ausdrücklich das vollständige JJJJ-Format anzugeben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X