2009-05-22 7 views
0

Gibt es eine Möglichkeit, Zeitzone Informationen direkt aus einem oracle.sql.TIMESTAMPTZ Objekt (ausgewählt aus einer TIMESTAMP WITH TIME ZONE Spalte) zu extrahieren?Extraktion Zeitzone von Oracle JDBC TIMEZONETZ Objekt

Idealerweise würde ich gerne die Zeitzoneninformationen direkt aus dem Objekt ziehen können, ohne durch potenziell teure oder zerbrechliche Ringe springen zu müssen (wie Dinge in Strings umzuwandeln und diese zu analysieren).

Sie würden denken, dass es einen einfachen Weg gibt, dies zu tun, aber ich muss noch einen finden. Oracles Dokumentation ist nicht sehr hilfreich. Es behauptet, dass die letzten zwei Bytes, die von TIMESTAMPTZ#toBytes() zurückgegeben werden, die Zeitzoneninformation kodieren, aber es gibt keine Beschreibung von unserer, diese Information tatsächlich zu decodieren.

Wer da draußen hat Erfahrung mit diesem Zeug?

Antwort

1

Oracle hat spezifische Datumsformatelemente für diese: TZD, TZH, TZM und TZR.

Ein Beispiel:

SQL> create table t (col timestamp with time zone) 
    2/

Tabel is aangemaakt. 

SQL> insert into t values (sysdate) 
    2/

1 rij is aangemaakt. 

SQL> select col 
    2  , to_char(col,'TZD') time_zone_daylight_info 
    3  , to_char(col,'TZH') time_zone_hour 
    4  , to_char(col,'TZM') time_zone_minute 
    5  , to_char(col,'TZR') time_zone_region 
    6 from t 
    7/

COL        TIME_Z TIM TI TIME_ZONE_REGION 
------------------------------- ------ --- -- -------------------------------- 
22-05-09 09:12:33,000000 +02:00  +02 00 +02:00  

1 rij is geselecteerd. 

Oder mit der Funktion EXTRACT:

SQL> select col 
    2  , extract(timezone_abbr from col) time_zone_abbr 
    3  , extract(timezone_hour from col) time_zone_hour 
    4  , extract(timezone_minute from col) time_zone_minute 
    5  , extract(timezone_region from col) time_zone_region 
    6 from t 
    7/

COL        TIME_ZONE_       TIME_ZONE_HOUR      TIME_ZONE_MINUTE 
------------------------------- ---------- -------------------------------------- -------------------------------------- 
TIME_ZONE_REGION 
---------------------------------------------------------------- 
22-05-09 09:15:24,000000 +02:00 UNK            2          0 
UNKNOWN 


1 rij is geselecteerd. 

Grüße, Rob.

+0

Danke. Ich glaube nicht, dass es einen Weg gibt, dies zu tun, ohne Format-Elemente oder die Extrakt-Funktion (dh ich habe eine bestehende Anwendung, die ich Zeitzone-bewusst machen möchte, und es wäre schön, wenn ich dies tun könnte ohne alle vorhandenen SQL-Anweisungen zu ändern)? – Allen

+0

Nicht, dass ich mir dessen bewusst bin. Dieser Beitrag scheint das gleiche zu empfehlen: http://stackoverflow.com/questions/223096?sort=oldest. Sie können natürlich die chinesische Methode anwenden: Einstellung auf alle möglichen Zeitzoneninformationen und Überwachung der letzten zwei Bytes ... –

0

Das Format von TIMESTAMPTZ ist well documented. Wir verwenden derzeit the following code, um die Zeitzoneninformationen zu extrahieren.

Wenn Sie auf Java SE 8 sind, können Sie getObject(int, OffsetDateTime.class) verwenden, wenn Sie getObject(int, ZonedDateTime.class) verwenden, können Sie von bug 25792016 betroffen sein.