[英]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.