2010-10-13 20 views
2

Utilisation d'Oracle 9.2i j'ai besoin pour obtenir le décalage de différentes dates d'un timezones par rapport à un autre fuseau horaire, auparavant je l'ai fait en tant que telledécalages Timezone dans Oracle

select 
(TO_DATE('10-Oct-2010 09:00:00','DD-Mon-YYYY HH24:Mi:SS') - 
       TO_DATE(TO_CHAR(FROM_TZ(to_timestamp('10-Oct-2010 09:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'Australia/Victoria') 
       AT TIME ZONE 'Australia/West'  , 'DD-Mon-YYYY HH24:Mi:SS'),'DD-Mon-YYYY HH24:Mi:SS')) 
from dual 

qui, tout en un peu en désordre, a bien fonctionné pour mes besoins. Maintenant, le problème est que cela ne semble pas tenir compte de l'heure d'été. Le décalage horaire entre Victoria et l'Australie occidentale le 10 octobre est en fait de 3 heures, et non de 2 heures (car ma requête revient actuellement).

Maintenant, c'est étrange, car je pensais que FROM_TZ est moyen de gérer DST. Et même étranger, si je compare à l'heure GMT j'obtenir les bons résultats ..

select FROM_TZ(to_timestamp('10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'GMT') AT TIME ZONE 'Australia/West' 
from dual 

FROM_TZ(TO_TIMESTAMP('10-OCT-2 
------------------------------ 
10-OCT-10 08.00.00.000000000 AM AUSTRALIA/WEST 

correcte

select FROM_TZ(to_timestamp('10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'GMT') AT TIME ZONE 'Australia/Victoria' 
from dual 

FROM_TZ(TO_TIMESTAMP('10-OCT-2 
------------------------------ 
10-OCT-10 11.00.00.000000000 AM AUSTRALIA/VICTORIA 

Correct

select FROM_TZ(to_timestamp('10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'Australia/Victoria') AT TIME ZONE 'Australia/West' 
from dual 

FROM_TZ(TO_TIMESTAMP('10-OCT-2 
------------------------------ 
09-OCT-10 10.00.00.000000000 PM AUSTRALIA/WEST 

Mauvais. 10-Oct-2010 00:00:00 à Victoria est 09-OCT-10 21:00 PM en Australie-Occidentale.

Donc la question est, est-ce un bug? ou suis-je simplement en utilisant ce FROM_TZ .. AT TIME ZONE faux?

Merci.

Mise à jour:

Je pense que cela pourrait être un bogue dans la fonction TO_CHAR, il semble obtenir le mauvais TZ décalage. Alors que FROM_TZ peut correctement passer de GMT à l'heure de Victoria, quand vous essayez d'extraire le décalage TZ de cela, il indique son +10, alors qu'il devrait être +11.

select TO_CHAR(FROM_TZ(to_timestamp('10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'Australia/Victoria'), 'TZH:TZM') 
     ,FROM_TZ(to_timestamp('10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS'), 'GMT') AT TIME ZONE 'Australia/Victoria' 
from dual 

TO_CHAR(FROM_TZ(TO_TIMESTAMP('            FROM_TZ(TO_TIMESTAMP('10-OCT-2 
--------------------------------------------------------------------------- ------------------------------ 
+10:00                  10-OCT-10 11.00.00.000000000 AM AUSTRALIA/VICTORIA 

Répondre

1

Pour autant que je peux dire, TZH et TZM sont des chaînes de fuseau horaire abrégée, mais ils ne tiennent pas compte des économies de lumière du jour. Le fuseau horaire de Victoria est +10: 00.

Peut-être TZD est ce que vous cherchez.

TZD Informations sur l'heure d'été. La valeur TZD est un fuseau horaire abrégé chaîne avec l'heure d'été informations.

http://download.oracle.com/docs/cd/B28359_01/olap.111/b28126/dml_commands_1029.htm

select TO_CHAR(FROM_TZ(ts, 'Australia/Victoria'), 'TZH:TZM TZD') 
     ,FROM_TZ(ts, 'GMT') AT TIME ZONE 'Australia/Victoria' 
from (select to_timestamp('10-Oct-2010 00:00:00','DD-Mon-YYYY HH24:Mi:SS') 
      as ts 
     from dual); 

+10:00 EST 10/10/2010 10:00:00.000000000 AM +10:00