SQL Oracle PL/SQL Zeit in richtiger Zeitzone darstellen

-=Renegade=-

Lt. Junior Grade
Registriert
Nov. 2006
Beiträge
427
Hallo,

Ich bin gerade glaub ich ein wenig vernagelt für ein sehr einfaches Problem, aber vllt. kann mir wer von euch helfen, meine Gedankensperre zu durchbrechen :D

Ich hab als Basis einen Unixtimestamp, welchen ich in eine Oracle-gültiges Zeitformat umrechne, zB: TO_DATE('19700101000000','YYYYMMDDHH24MISS') + NUMTODSINTERVAL(ZEIT, 'SECOND') (ZEIT -> Unix Timestamp)

Nun ist mir klar, dass TO_DATE keine Zeitzonen Information speichern kann (jedoch ein Timestamp, zB mit TO_TIMESTAMP_TZ)

Allerdings möchte ich nun bei der Ausgabe dieses Zeitstempels das Zeitformat bereits in unserer Zeitzone (also GMT+1) haben und zwar nicht 15:43 +01:00 sondern 16:43

Aber irgendwie hab ich gerade überhaupt keinen Plan, wie ich das realisieren kann.
select sessiontimezone from dual liefert +01:00 zurück.

Vermutlich gehe ich das Problem gerade auch von der falschen Seite an...


Vielen Dank für Vorschläge
 
Naja, was soll ich sagen?
Der Timestamp ist in UTC und das würde ich auch so lassen. Stattdessen sollte deine (Web)App die Darstellung der aktuellen Zeitzone anwenden.
Von UTC auf GMT+1 ist nun nicht wirklich Hexerei. Einfach eine Stunde drauf addieren.

Edit.
Es wäre vlt. hilfreich zu wissen über welche Sprache die Ausgabe erfolgt. Das steigert bekanntlich die Chance auf einen Code-Snippet ;)
 
PL/SQL, steht eh im Titel :)

Also die Ausgabe bzw. Formatierung erfolgt auch in einer PL/SQL Prozedur.

Eine Stunde hardcodiert dazurechnen wäre natürlich eine einfache Möglichkeit, allerdings erscheint mir das nicht sehr sauber von der Programmierung her. Wenn ich schon Zeitzonen anbiete, muss es doch eine formatierte Ausgabe dafür geben? Im Sinne von Universalität, beispielsweise anderen Zeitzonen usw.
 
-=Renegade=- schrieb:
PL/SQL, steht eh im Titel :)

Also die Ausgabe bzw. Formatierung erfolgt auch in einer PL/SQL Prozedur.

Eine Stunde hardcodiert dazurechnen wäre natürlich eine einfache Möglichkeit, allerdings erscheint mir das nicht sehr sauber von der Programmierung her. Wenn ich schon Zeitzonen anbiete, muss es doch eine formatierte Ausgabe dafür geben? Im Sinne von Universalität, beispielsweise anderen Zeitzonen usw.

Sowas macht man aber nicht über die DB sondern über die Culture/Globalization-Values der Sprache die du benutzt. Verschiedene Zeitzonen bedeuten nicht, dass nur die Uhrzeit "verschoben" ist.
 
Das wär auch meine Annahme gewesen, die Session Timezone ist allerdings auch richtig eingestellt, ebenso wie alle sonstigen relevanten NLS Parameter auf Deutsch usw gestellt sind.

-=Renegade=- schrieb:
select sessiontimezone from dual liefert +01:00 zurück.

Deshalb sehe ich momentan keine andere Möglichkeit, aber wie gesagt, vllt sehe ich einfach vor lauter Bäumen den Wald nicht ;)
 
Wir reden aneinander vorbei.
Mir wurscht. Hier ist was du suchst:
Code:
SELECT to_date('01-JAN-1970','dd-mon-yyyy')+((TIMESTAMP+3600)/60/60/24) FROM dual

TIMESTAMP mit dem Wert aus deinem Table ersetzen.

Edit.
Sorry. GMT+1 vergessen. Hab den Query angepasst.
 
Zuletzt bearbeitet:
Wie bereits erwähnt, eine Stunde hardcodiert dazuzurechnen ist sicher die einfachste Möglichkeit, allerdings finde ich das keine saubere Programmierung, schon alleine wegen Daylight Savings.
 
-=Renegade=- schrieb:
Wie bereits erwähnt, eine Stunde hardcodiert dazuzurechnen ist sicher die einfachste Möglichkeit, allerdings finde ich das keine saubere Programmierung, schon alleine wegen Daylight Savings.

Wenn es dir ausschließlich um die Zeit geht ersetz das +3600 durch ein Produkt aus 3600* (SELECT sessiontimezone FROM dual)
 
Zuletzt bearbeitet:
Bevor ich es vergesse, es gibt doch eine saubere Lösung für das Problem, sollte mal jemand auf etwas ähnliches stoßen.

Der Fehler lag einfach in der Zeitstempel Berechnung, richtig wäre:

Code:
SELECT TO_TIMESTAMP_TZ('19700101000000 +0:00','YYYYMMDDHH24MISS TZH:TZM') + NUMTODSINTERVAL(ZEIT, 'SECOND')

Wird nicht explizit die Zeitzone +0:00 angegeben wird die Sessiontimezone verwendet, was dazu führt, das der Zeitstempel schon falsch berechnet wird und daher nie mehr richtig dargestellt werden kann.


so long
Renegade
 
Zurück
Oben