5

DB に設定されたタイムスタンプのバイトの意味を理解しようとしています。より読みやすい日付を生成するためにどのように計算されますか?

以下のクエリを使用して、必要なデータを取得しています。

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たものと同じかどうかを確認するスクリプトを作成しようとしています。

どんな助けでも大歓迎です。

4

1 に答える 1

5

表面的には似ているが内部的に異なるさまざまな日時データ型があります。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                                 

それらのうち、タイムスタンプ列のみ、リンク先の記事の内部形式を使用し、年に 100 を超える表記を使用します。

その他の場合、最初のバイトは base-256 修飾子で、2 番目のバイトは base 256 年です。あなたはそれを次のように解釈します

223 + (7 * 256) = 2015

内部ストレージの詳細については、My Oracle Support のドキュメント 69028.1 を参照してください。それと、コメントでリンクされている以前の回答は、2 つの日付型を参照していますが、タイムスタンプは秒まで同じように扱われ、残りの一部は型 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 の場合、小数秒は同じですが、バイトが逆になっています。

于 2015-07-31T09:56:55.230 に答える