带有TIMEZONE的Oracle TIMESTAMP命名区域与偏移量

时间:2009-02-25 22:54:01

标签: oracle datetime timezone timestamp dst

在oracle中,指定的时区是否始终存储?

我一直在我们的系统中测试这个列,在某些地方,时间戳显示为:

26-FEB-09 11.36.25.390713 AM +13:00

但有时则是:

26-FEB-09 11.36.25.390713 AM Pacific/Auckland

如果将值存储为前者,是否表示实际时区未存储?

我担心,因为如果未来日期只存储了偏移量,我们可能无法确定原始时区的实际时间,因为您可以确定时区的偏移量,但反之亦然。

由于

2 个答案:

答案 0 :(得分:11)

测试非常简单

 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

它存储你告诉它的内容。如果你告诉它一个偏移量,那么这个偏移对一个或多个时区来说可能是好的,那么为什么它只选择一个呢?

答案 1 :(得分:2)

我发现在打开连接时在ODP.NET中设置TimeZone和格式似乎可以解决这个问题:

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);