在 oracle 中,是否始终存储命名时区?
我一直在我们的系统中测试这个专栏,在某些地方时间戳显示为:
26-FEB-09 11.36.25.390713 AM +13:00
但其他时候是:
26-FEB-09 11.36.25.390713 AM Pacific/Auckland
如果该值作为前者存储,这是否意味着未存储实际时区?
我担心,因为如果未来日期仅存储一个偏移量,我们可能无法确定原始时区的实际时间,因为您可以确定时区的偏移量,但反之则不行。
谢谢
这很容易测试
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
它存储您告诉它的内容。如果你告诉它一个偏移量,这个偏移量可能对一个或多个时区都有好处,那么它为什么只选择一个呢?
我发现打开连接时在 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);