簡體   English   中英

Oracle的轉儲(systimestamp)字節的含義

[英]Meaning of Oracle's dump(systimestamp) bytes

我試圖理解我的數據庫中設置的時間戳的字節是什么意思。 如何計算它們以生成更易讀的日期?

我正在使用以下查詢來獲取我需要的數據:

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等。

我試圖這樣做的原因是因為我將timestamp(3)列中的值與systimestamp進行比較時遇到的問題我正在嘗試編寫腳本以驗證我的問題/解決方案是否相同如此處所述

任何幫助表示贊賞。

有一些表面上相似但內部不同的日期時間數據類型。 systimestamp是188型(並systimestamp區信息); 時間戳文字是類型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                                 

其中,只有時間戳列使用您鏈接到的文章中的內部格式,使用年份超過100的表示法。

對於其他字節,第一個字節是base-256修飾符,第二個字節是256年的基數; 所以你會把它解釋為

223 + (7 * 256) = 2015

您可以在My Oracle Support文檔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,小數秒是相同的但是字節反轉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM