Oracle TIMESTAMP с именованной зоной TIMEZONE и смещением - PullRequest
7 голосов
/ 26 февраля 2009

В оракуле всегда хранится именованный часовой пояс?

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

26-FEB-09 11.36.25.390713 AM +13:00

но в других случаях это:

26-FEB-09 11.36.25.390713 AM Pacific/Auckland

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

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

Спасибо

Ответы [ 2 ]

11 голосов
/ 26 февраля 2009

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

 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

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

2 голосов
/ 03 марта 2009

Я обнаружил, что установка 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);
...