2009-02-25 13 views
6

W Oracle, czy nazwa strefy czasowej jest zawsze przechowywana?Oracle TIMESTAMP WITH TIMEZONE o nazwie strefa kontra offset

I zostały badania tej kolumny w naszym systemie, a w niektórych miejscach timestamp jest pokazany jako:

26-FEB-09 11.36.25.390713 AM +13:00 

ale inne czasy to:

26-FEB-09 11.36.25.390713 AM Pacific/Auckland 

Jeśli wartość jest przechowywana jako pierwszy, czy to oznacza, że ​​aktualna strefa czasowa nie jest przechowywana?

Martwię się, ponieważ jeśli data na przyszłość zostanie zapisana z przesunięciem, możemy nie być w stanie określić rzeczywistego czasu w oryginalnej strefie czasowej, ponieważ można określić przesunięcie ze strefy czasowej, ale nie odwrotnie.

Dzięki

Odpowiedz

2

Znalazłem że ustawienie strefę czasową i format ciągu ODP.NET gdy połączenie jest otwarte wydaje się rozwiązać ten problem:

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

Jest to dość łatwe do sprawdzenia

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 

Przechowuje co to powiedzieć. Jeśli powiesz mu przesunięcie, to przesunięcie może być dobre dla jednej lub więcej stref czasowych, więc dlaczego miałoby wybrać jeden?

+0

OK, super, że to, co wcześniej spodziewałem. Powiedzmy, że mam kolumnę "utworzoną", która ma mieć domyślną wartość bieżącego znacznika czasu. Obecnie w moim DB wywołanie systimestamp zwraca znacznik czasu z przesunięciem. Jak mogę to zmienić, aby używać nazwanej strefy czasowej? Dzięki – tobyc

+0

Whoa ... Oracle zwraca to, co mówisz, aby powrócić. Wszelkie domyślne zachowanie jest domyślne. Nigdy nie polegaj na domyślnych, zawsze wyraźnych. I nie sądzę, że systimestamp ma to, ale wybierz to_char (systimestamp, "YYYYMMDD HH24: MI: SS.FF TZR") || '' || SESSIONTIMEZONE z podwójnej woli. –

+0

wybierz wyciąg (TIMEZONE_REGION z systimestamp) z podwójnego wyniku UNKNOWN –

Powiązane problemy