2009-05-22 12 views
0

Existe-t-il un moyen d'extraire les informations de fuseau horaire directement à partir d'un objet oracle.sql.TIMESTAMPTZ (sélectionné dans une colonne TIMESTAMP WITH TIME ZONE)?Extraire le fuseau horaire de l'objet Oracle JDBC TIMEZONETZ

Idéalement, j'aimerais pouvoir extraire les informations de fuseau horaire directement de l'objet sans passer par des cerceaux potentiellement chers ou fragiles (comme convertir des choses en chaînes et les analyser).

Vous penseriez qu'il y a un moyen facile de le faire, mais je n'ai pas encore trouvé un. La documentation d'Oracle n'est pas très utile. Il prétend que les deux derniers octets retournés par TIMESTAMPTZ#toBytes() encodent les informations de fuseau horaire, mais il n'y a aucune description de notre pour réellement décoder cette information.

Quelqu'un a-t-il de l'expérience dans ce domaine?

Répondre

1

Oracle a des éléments de format de date spécifiques pour ceux-ci: TZD, TZH, TZM et TZR.

Un exemple:

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. 

ou en utilisant la fonction 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. 

Cordialement, Rob .

+0

Merci. Je ne pense pas qu'il existe un moyen de le faire sans utiliser les éléments de format ou la fonction d'extraction (c'est-à-dire, j'ai une application existante que je voudrais utiliser timezone) et ce serait bien si je pouvais le faire sans changer toutes les instructions SQL existantes)? – Allen

+0

Pas que je sache. Cet article semble suggérer la même chose: http://stackoverflow.com/questions/223096?sort=oldest. Vous pouvez bien sûr appliquer la méthode chinoise: paramétrer toutes les informations possibles sur le fuseau horaire et regarder les deux derniers octets ... –

0

Le format de TIMESTAMPTZ est well documented. Nous utilisons actuellement the following code pour extraire les informations de fuseau horaire. Si vous utilisez Java SE 8, vous pouvez utiliser getObject(int, OffsetDateTime.class). Si vous utilisez getObject(int, ZonedDateTime.class), vous pouvez être affecté par bug 25792016.