2009-02-25 3 views
6

В оракуле всегда сохранен названный часовой пояс?Oracle TIMESTAMP WITH TIMEZONE с именем zone vs offset

Я тестировал эту колонку в нашей системе, а в некоторых местах, метка времени отображается как:

26-FEB-09 11.36.25.390713 AM +13:00 

но иногда это:

26-FEB-09 11.36.25.390713 AM Pacific/Auckland 

Если значение хранится в первый, означает ли это, что фактический часовой пояс не хранится?

Я беспокоюсь, потому что, если будущая дата хранится только с смещением, мы не сможем определить фактическое время в исходном часовом поясе, потому что вы можете определить смещение от часового пояса, но не наоборот.

Благодаря

ответ

2

Я обнаружил, что установка TimeZone и формат в ODP.NET, когда соединение открыто, кажется, решить эту проблему:

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

Это довольно легко проверить

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 

Он хранит то, что вы говорите это. Если вы скажете это смещение, это смещение может быть хорошим для одного или нескольких часовых поясов, так почему бы просто выбрать один?

+0

OK, остудить, это то, что я ожидал. Так сказать, у меня есть «созданный» столбец, который я хочу иметь значение по умолчанию текущей метки времени. В настоящее время в моей БД вызов systimestamp возвращает временную метку со смещением. Как изменить это, чтобы использовать названный часовой пояс? Thanks – tobyc

+0

Whoa ... Oracle возвращает то, что вы говорите, чтобы вернуться. Любое поведение по умолчанию является значением по умолчанию. Никогда не полагайтесь на значение по умолчанию, всегда явное. И я не думаю, что systimestamp имеет это, но выберите to_char (systimestamp, 'YYYYMMDD HH24: MI: SS.FF TZR') || '' || SESSIONTIMEZONE от двойной воли. – 2009-02-26 00:26:31

+0

выберите экстракт (TIMEZONE_REGION из systimestamp) из двойных результатов в UNKNOWN – 2009-02-26 00:27:44