ive*_*nxu 5 oracle timestamp-with-timezone
基于 Oracle 文档,它在内部以数字形式存储时间戳和时区的不同部分。我读了这篇文章http://www.orafaq.com/wiki/Timestamp ,它解释了时间戳内部格式的算法。所以我做了一个简单的测试来验证它。
SQL> create table tz_test(id number, tz timestamp with time zone);
Table created.
SQL> insert into tz_test values(1, timestamp '1999-10-29 21:00:00 -7:00');
1 row created.
SQL> insert into tz_test values(2, timestamp '1999-10-29 21:00:00 US/Pacific');
1 row created.
SQL> select id, dump(tz, 10) from tz_test where tz=timestamp '1999-10-29 21:00:00 -7:00';
ID DUMP(TZ,10)
--------------------------------------------------------------------------------
1 Typ=181 Len=13: 119,199,10,30,5,1,1,0,0,0,0,13,60
2 Typ=181 Len=13: 119,199,10,30,5,1,1,0,0,0,0,137,156
Run Code Online (Sandbox Code Playgroud)
orafaq 中的文章谈到了 oracle 如何存储时区偏移量,我的第一行测试证明了这一点。但是没有关于如何存储时区文字的内容。所以我很想知道它。我也想知道 oracle 在内部如何评估时间戳 '1999-10-29 21:00:00 -7:00' 和时间戳 '1999-10-29 21:00:00 US/Pacific' 是相同的。
它们似乎是时区文件中的区域 ID ,例如$ORACLE_HOME/oracore/zoneinfo/timezone_14.dat。
在此 SQL Fiddle 中,具有时区区域的值的PST8PDT最后两个字节为0x83, 0x64;它与 MOS 文档 ID 414590.1 建议的值相匹配。
我看不到任何列出所有可能值的参考,也看不到任何检查时区文件的明显方法。它似乎没有被记录,这对于内部格式来说并不是不合理的。您可以使用相同的方法找出您感兴趣的值或所有值,但我不确定您为什么要这样做。
您可能会发现另一个有用的支持文档 340512.1,这是有关时间戳和时区的常见问题解答。
要将地区名称转换为偏移值,您可以使用该tz_offs函数,但它使用当前日期 - 因此您得到的答案将取决于您是在冬天还是夏天询问。要获取特定日期的偏移量,您需要将该时间戳与 UTC 时间戳进行比较。而且您实际上不能走相反的路,因为多个时区区域映射相同的偏移量。