2010-08-31 6 views
0

Dans Oracle, comment convertir un "horodatage avec fuseau horaire" dans le fuseau horaire actuel du serveur? Je dois déterminer dynamiquement quel est le fuseau horaire actuel du serveur.Conversion d'un champ de colonne "horodatage avec fuseau horaire" en fuseau horaire du serveur

create table test_table1 
(rec1 timestamp with time zone) 

insert into test_table1(rec1) values (
to_timestamp_tz('1/1/1900 09:00:00 AM US/EASTERN','dd-mm-yyyy hh:mi:ss AM TZR') 
) 

SELECT NEW_TIME(rec1, TO_CHAR(rec1, 'TZR'), TO_CHAR(SYSTIMESTAMP, 'TZR')) 
FROM test_table1 

L'exemple ci-dessus crée une table avec la colonne de fuseau horaire. Ensuite, j'insère une rangée dans la table avec le fuseau horaire de l'Est. L'instruction select ne fonctionne pas. Ce que j'essaye de réaliser est de convertir la colonne rec_1 au fuseau horaire du serveur et renvoyer cela.

Répondre

0

Vous pouvez obtenir le fuseau horaire du système actuel [dans un format ou autre] par:

select to_char(systimestamp,'TZD | TZH TZM [ TZR ]'), DBTIMEZONE 
from dual; 

Ce qui suit peut aider à la conversion. Vous ne savez pas si le fuseau horaire de votre session est le même que le fuseau horaire de votre base de données.

SELECT rec1, SYS_EXTRACT_UTC(rec1), cast(rec1 as timestamp with local time zone) 
FROM test_table1 

quand j'utilise systeimestamp je reçois null

TZD peut retourner null (par exemple, il sait ce que le décalage, mais n'a pas encore un 'alias' pour elle) . TZR ne devrait pas. Peut-être quelque chose comme ...

SELECT FROM_TZ(TIMESTAMP '2000-03-28 08:00:00', to_char(systimestamp,'TZR')) 
    FROM DUAL; 
+0

L'extraction de la colonne rec1 de la table est directe. Quand j'utilise la requête: select to_char (rec1, 'TZD') de test_table1 j'obtiens 'EST'/'CST' mais quand j'utilise systeimestamp je reçois la valeur null. Je veux obtenir le fuseau horaire actuel du système au format 'EST' .. et utiliser la fonction new_date pour le convertir en oriental. Donc, si c'est l'Est, la même heure reviendra et sinon, elle sera convertie. – user305801

+0

J'ai obtenu le DBA pour définir le dbtimezone au fuseau horaire correct (-04: 00). Maintenant que j'ai le cela, comment puis-je convertir cette date ou l'heure de la base de données en fuseau horaire de l'Est. Je veux également prendre en considération l'heure avancée. Alors que le tz_offset est -04: 00 avec DTS, il est vraiment -05: 00. – user305801

0

Oracle convertit les fuseaux horaires en fonction de la norme et l'heure d'été si les régions « TZR » sont utilisés au lieu d'heures et minutes « TZH: TZM » offset.

Pour qualifier votre région, vous pouvez utiliser (11g pas sûr d'autres versions)

SELECT SYSTIMESTAMP AT TIME ZONE 'US/Eastern' FROM DUAL; 

La région utilisée doit être stocké dans la base de données que vous pouvez vérifier par

SELECT * FROM v$timezone_names WHERE tzname LIKE 'US%'; 

Cette requête peut être modifié pour identifier une région.

Le manuel Oracle Globalization Support est également une bonne référence.