2009-02-25 22 views
6

En Oracle, ¿la zona horaria se almacena siempre?Oracle TIMESTAMP WITH TIMEZONE llamado zone vs offset

he estado probando esta columna dentro de nuestro sistema, y ​​en algunos lugares se muestra la fecha y hora como:

26-FEB-09 11.36.25.390713 AM +13:00 

pero otras veces es:

26-FEB-09 11.36.25.390713 AM Pacific/Auckland 

Si el valor se almacena como el primero, ¿eso significa que la zona horaria real no se está almacenando?

Me preocupa porque si una fecha futura se almacena con solo un desplazamiento, es posible que no podamos determinar la hora real en la zona horaria original, porque puede determinar un desplazamiento desde una zona horaria, pero no al revés.

Gracias

Respuesta

2

que he encontrado que la fijación de la zona horaria y el formato dentro ODP.NET cuando se abre una conexión parece resolver este problema:

OracleGlobalization info = conn.GetSessionInfo(); 
info.TimeZone = "Pacific/Auckland"; 
info.TimeStampFormat = "DD-MON-YYYY HH:MI:SS.FF AM"; 
info.TimeStampTZFormat = "DD-MON-YYYY HH:MI:SS.FF AM TZR"; 
conn.SetSessionInfo(info); 
8

Es bastante fácil de probar

create table foo (tswtz TIMESTAMP WITH TIME ZONE); 
    /

insert into foo values (TO_TIMESTAMP_TZ ('21-FEB-2009 18:00:00 -5:00', 'DD-MON-YYYY HH24:MI:SS TZH:TZM')); 


insert into foo values (TO_TIMESTAMP_TZ ('21-FEB-2009 18:00:00 EST', 'DD-MON-YYYY HH24:MI:SS TZR')); 
    select tswtz, extract(timezone_abbr from tswtz), extract(TIMEZONE_REGION from tswtz) 
from foo; 


TSWTZ   EXTRACT(TIMEZONE_ABBRFROMTSWTZ) EXTRACT(TIMEZONE_REGIONFROMTSWTZ)         
------------- ------------------------------- ---------------------------------------------------------------- 
21-FEB-09 06.00.00.000000000 PM -05:00 UNK       UNKNOWN               
21-FEB-09 06.00.00.000000000 PM EST  EST        EST                

2 rows selected 

Almacena lo que le dices. Si le dices una compensación, esa compensación podría ser buena para una o más zonas horarias, entonces ¿por qué simplemente elegiría una?

+0

bien, fresco, eso es lo que he esperado. Digamos que tengo una columna "creada" en la que quiero tener un valor predeterminado de la marca de tiempo actual. Actualmente en mi base de datos una llamada a systimestamp devuelve una marca de tiempo con un desplazamiento. ¿Cómo cambio esto para usar la zona horaria nombrada? Gracias – tobyc

+0

Whoa ... Oracle devuelve lo que le dice que regrese. Cualquier comportamiento predeterminado es un predeterminado. Nunca confíe en el valor predeterminado, siempre sea explícito. Y no creo que systimestamp tenga eso, pero seleccione to_char (systimestamp, 'AAAAMMDD HH24: MI: SS.FF TZR') || '' || SESSIONTIMEZONE de doble voluntad. –

+0

seleccione extraer (TIMEZONE_REGION de systimestamp) de resultados duales en UNKNOWN –