oracle - oracle 如何在内部存储带时区的时间戳

标签 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

orafaq 中的文章谈到了 oracle 如何存储时区偏移量,我的第一行测试证明了这一点。但是没有关于如何存储时区文字的内容。所以我很想知道它。我也想知道 oracle 在内部如何评估时间戳 '1999-10-29 21:00:00 -7:00' 和时间戳 '1999-10-29 21:00:00 US/Pacific' 是相同的。

最佳答案

它们似乎是来自 time zone file 的区域 ID。 ,例如$ORACLE_HOME/oracore/zoneinfo/timezone_14.dat .

In this SQL Fiddle , 时区区域的值 PST8PDT最后两个字节为 0x83 , 0x64 ;它与 MOS 文档 ID 414590.1 建议的值相匹配。

我看不到任何列出所有可能值的引用,或任何明显的检查时区文件的方法。它似乎没有记录在案,这对于内部格式来说并非不合理。您可以使用相同的方法找出您感兴趣的值或所有值,但我不确定您为什么要这样做。

您可能会发现另一个有用的支持文档 340512.1,它是有关时间戳和时区的常见问题解答。

要将区域名称转换为偏移值,您可以使用 the tz_offs function ,但它使用当前日期 - 因此您得到的答案将取决于您是在冬季还是夏季询问。要获得某个日期的偏移量,您需要将该时间戳与 UTC 时间戳进行比较。而且您不能真正走另一条路,因为多个时区区域映射相同的偏移量。

关于oracle - oracle 如何在内部存储带时区的时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23309100/

相关文章:

datetime - 在 Hive 中将字符串转换为时间戳

sql-server - 如何使用 OracleBulkCopy 格式化 SQL Server DateTimeOffset 并移动到 Oracle

postgresql - 如何在 PostgreSQL 中制作交叉表?

sql - UNION ALL 的 Oracle 优化器问题

oracle - 使用 Azure 数据工厂通过 S2s VPN 连接到本地 Oracle

python-3.x - 转换 pandas 时间戳列表

java - 是否可以不使用格式解析将字符串转换为日期或时间戳

oracle 程序给出 ORA-00905 : missing keyword

c++ - 使用 C++ 连接到 oracle 数据库,基础知识

java - spring boot应用是否支持OpenJDK