2009-02-25 13 views
6

In oracle, il fuso orario denominato viene sempre memorizzato?Oracle TIMESTAMP WITH TIMEZONE denominato zone vs offset

Ho testato questa colonna all'interno del nostro sistema, e in alcuni luoghi viene mostrato il timestamp come:

26-FEB-09 11.36.25.390713 AM +13:00 

ma altre volte è:

26-FEB-09 11.36.25.390713 AM Pacific/Auckland 

Se il valore viene memorizzato come il primo, vuol dire che il fuso orario effettivo non viene memorizzato?

Mi preoccupo perché se una data futura viene memorizzata con un solo offset potremmo non essere in grado di determinare l'ora effettiva nel fuso orario originale, perché è possibile determinare un offset da un fuso orario, ma non viceversa.

Grazie

risposta

2

ho trovato che l'impostazione del fuso orario e il formato all'interno di ODP.NET quando una connessione viene aperta sembra risolvere questo 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

è abbastanza facile per testare

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 

Memorizza quello che gli dici. Se gli dici un offset, quell'offset potrebbe andare bene per uno o più fusi orari, quindi perché sceglierne uno solo?

+0

OK, fresco, questo è quello che ho aspettato. Quindi dire che ho una colonna "creata" che voglio avere un valore predefinito del timestamp corrente. Attualmente nel mio DB una chiamata a systimestamp restituisce un timestamp con un offset. Come posso cambiarlo per usare il fuso orario denominato? Grazie – tobyc

+0

Whoa ... Oracle restituisce ciò che gli dici di tornare. Qualsiasi comportamento predefinito è un valore predefinito. Mai fare affidamento sul valore predefinito, sii sempre esplicito. E non penso che systimestamp lo abbia ma selezioniamo to_char (systimestamp,'YYYYMMDD HH24: MI: SS.FF TZR ') || '' || SESSIONTIMEZONE dalla doppia volontà. –

+0

selezionare estratto (TIMEZONE_REGION da systimestamp) da doppio risultato in UNKNOWN –

Problemi correlati