加入收藏 | 设为首页 | 会员中心 | 我要投稿 PHP编程网 - 黄冈站长网 (http://www.0713zz.com/)- 数据应用、建站、人体识别、智能机器人、语音技术!
当前位置: 首页 > 百科 > 正文

Oracle的转储(systimestamp)字节的含义

发布时间:2021-01-17 13:56:58 所属栏目:百科 来源:网络整理
导读:我试图理解我的数据库中设置的时间戳的字节是什么意思.如何计算它们以生成更易读的日期? 我正在使用以下查询来获取我需要的数据: SELECT systimestamp,DUMP (systimestamp),sessiontimezoneFROM 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,31,8,55,6,216,88,92,9,5,0 | Europe/Bucharest |
+-------------------------------------+-----------------------------------------------------------------+------------------+

我在网上找到了一些资源来解释字节的含义(here),但规则在我的场景中并不匹配.

例如:223不是世纪100等.

我试图这样做的原因是因为我将时间戳(3)列中的值与systimestamp进行比较时遇到的问题我正在尝试编写脚本以验证我的问题/解决方案是否相同as explained here.

任何帮助表示赞赏.

解决方法

有一些表面上相似但内部不同的日期时间数据类型. systimestamp是188型(并有时区信息);时间戳文字是类型187,没有时区信息,188是它;一个普通的时间戳列是180型:

select dump(systimestamp) from dual;

DUMP(SYSTIMESTAMP)                                                             
--------------------------------------------------------------------------------
Typ=188 Len=20: 223,50,28,11,128,203,79,35,1,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,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,3,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,56,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,小数秒是相同的但是字节反转.

(编辑:PHP编程网 - 黄冈站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读