Oracle 甲骨文的含义';s转储(systimestamp)字节

Oracle 甲骨文的含义';s转储(systimestamp)字节,oracle,oracle11g,time-format,systimestamp,Oracle,Oracle11g,Time Format,Systimestamp,我试图理解数据库上设置的时间戳中的字节是什么意思。如何计算它们以生成更可读的日期 我正在使用以下查询获取我需要的数据: SELECT systimestamp ,DUMP (systimestamp) ,sessiontimezone FROM dual; 我上面查询的结果是: +-------------------------------------+--------------------------------------------------------------

我试图理解数据库上设置的时间戳中的字节是什么意思。如何计算它们以生成更可读的日期

我正在使用以下查询获取我需要的数据:

SELECT systimestamp
    ,DUMP (systimestamp)
    ,sessiontimezone
FROM dual;
我上面查询的结果是:

+-------------------------------------+-----------------------------------------------------------------+------------------+
|            systimestamp             |                       dump(systimestamp)                        | sessiontimezone  |
+-------------------------------------+-----------------------------------------------------------------+------------------+
| 31-JUL-15 08.55.06.157047000 +00:00 | Typ=188 Len=20: 223,7,7,31,8,55,6,0,216,88,92,9,0,0,5,0,0,0,0,0 | Europe/Bucharest |
+-------------------------------------+-----------------------------------------------------------------+------------------+
我在网上找到了一些资源,解释了字节的含义(),但在我的场景中规则不匹配

例如:223不是世纪+100等

我之所以尝试这样做,是因为我在将
时间戳(3)
列中的值与
systimestamp
进行比较时遇到了一个问题,我试图编写一个脚本来验证我的问题/解决方案是否相同


非常感谢您的帮助。

有各种表面相似但内部不同的日期时间数据类型
systimestamp
为188型(具有时区信息);时间戳文字为187型,不含时区信息,188型;普通时间戳列的类型为180:

select dump(systimestamp) from dual;

DUMP(SYSTIMESTAMP)                                                             
--------------------------------------------------------------------------------
Typ=188 Len=20: 223,7,7,31,9,50,28,11,128,203,79,35,1,0,5,0,0,0,0,0             

select dump(timestamp '2015-07-31 08:55:06.157047 +00:00') from dual;

DUMP(TIMESTAMP'2015-07-3108:55:06.157047+00:00')              
---------------------------------------------------------------
Typ=188 Len=20: 223,7,7,31,8,55,6,0,216,88,92,9,0,0,5,0,0,0,0,0

select dump(timestamp '2015-07-31 08:55:06.157047') from dual;

DUMP(TIMESTAMP'2015-07-3108:55:06.157047')                    
---------------------------------------------------------------
Typ=187 Len=20: 223,7,7,31,8,55,6,0,216,88,92,9,0,0,3,0,0,0,0,0

create table t (ts timestamp);
insert into t (ts) values (timestamp '2015-07-31 08:55:06.157047');
select dump(ts) from t;

DUMP(TS)                                                                       
--------------------------------------------------------------------------------
Typ=180 Len=11: 120,115,7,31,9,56,7,9,92,88,216                                 
其中,只有一个timestamp列使用您链接到的文章中的内部格式,对年份使用超额-100表示法

对于其他字节,第一个字节是base-256修饰符,第二个字节是base-256年;所以你会把它解释为

223 + (7 * 256) = 2015
您可以在我的Oracle支持文档69028.1中阅读有关内部存储的更多信息。这一点,以及之前在注释中链接到的答案,指的是两种日期类型,但时间戳被视为相同的,一直到秒,其余部分可以推断为187/188类型-无论如何,分数秒部分:

Byte 1 - Base 256 year modifier: 223
2      - Base 256 year: 7 (256 * 7 = 1792 + 223 = 2015)
3      - Month: 7
4      - Day: 31
5      - Hours: 8
6      - Minutes: 55
7      - Seconds: 6
8      - Unused?
9      - Base 256 nanoseconds: 216
10     - Base 256 ns modifier 1: 256 * 88 = 22528
11     - Base 256 ns modifier 2: 256 * 256 * 92 = 6029312
12     - Base 256 ns modifier 3: 256 * 256 * 256 * 9 = 150994944
           => actual nanoseconds = 216 + 22528 + 6029312 + 150994944 
           => 157047000
13-20  - Time zone data?

对于类型120,小数秒是相同的,但字节是颠倒的。

请检查此答案:对于您的根本问题,请查看您的执行计划,并查看它是否在您的基本列上执行
sys\u extract\u utc
;然后试着直接在列上运行它,看看是否会出现相同的错误。@UlugbekUmirov我已经看到了答案,但它只有两种类型的时间戳(12和13)的信息,而我有一种不同的(188)时间戳类型。另外,查看了他们答案中的其他详细信息,找不到有关我的类型的详细信息。@RaduGheorghiu,答案是关于日期而不是时间戳;但是时间戳的日期部分(以及时间,精确到秒)的解释是相同的。所以它所说的13型也适用于187型和188型(以及其他类型)。太好了,谢谢!这个基准年修正值非常令人困惑。