千家信息网

Oracle基本数据类型存储格式浅析——日期类型TIMESTAMP WITH TIME ZONE

发表于:2024-11-25 作者:千家信息网编辑
千家信息网最后更新 2024年11月25日,原文链接: https://www.modb.pro/db/22143?cyn摘要:描述TIMESTAMP WITH TIME ZONE以及TIMESTAMP WITH LOCAL TIME ZONE
千家信息网最后更新 2024年11月25日Oracle基本数据类型存储格式浅析——日期类型TIMESTAMP WITH TIME ZONE

原文链接: https://www.modb.pro/db/22143?cyn

摘要:描述TIMESTAMP WITH TIME ZONE以及TIMESTAMP WITH LOCAL TIME ZONE类型的存储结构

本文对TIMESTAMP WITH LOCAL TIME ZONE和TIMESTAMP WITH TIME ZONE类型的存储格式进行简单的说明。

SQL> CREATE TABLE TEST_TIMESTAMP(TIME1 TIMESTAMP(9), TIME2 TIMESTAMP(6) WITH LOCAL TIME ZONE,   2  TIME3 TIMESTAMP(4) WITH TIME ZONE);表已创建。SQL> INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP);已创建 1 行。SQL> SELECT * FROM TEST_TIMESTAMP;TIME1----------------------------------------------------TIME2----------------------------------------------------TIME3----------------------------------------------------11-1月 -05 11.08.15.027000000 下午11-1月 -05 11.08.15.027000 下午11-1月 -05 11.08.15.0270 下午 +08:00SQL> SELECT DUMP(TIME1, 16), DUMP(TIME2, 16), DUMP(TIME3, 16) FROM TEST_TIMESTAMP;DUMP(TIME1,16)-------------------------------------------------------------DUMP(TIME2,16)-------------------------------------------------------------DUMP(TIME3,16)-------------------------------------------------------------Typ=180 Len=11: 78,69,1,b,18,9,10,1,9b,fc,c0Typ=231 Len=11: 78,69,1,b,18,9,10,1,9b,fc,c0Typ=181 Len=13: 78,69,1,b,10,9,10,1,9b,fc,c0,1c,3c

可以发现,如果客户端和数据库中的时区是一致的,那么TIMESTAMP和TIMESTAMP WITH LOCAL TIME ZONE存储的数据是完全一样的。
TIMESTAMP WITH TIME ZONE则略有不同,它保存的是0时区的时间,和所处的时区信息。
修改客户端主机的时区,由东8区(+8区)改为0时区。

SQL> INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP);已创建 1 行。

修改客户端主机的时区,改为西5区(-5时区)。

SQL> INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP);已创建 1 行。

修改客户端主机的时区,改为西12区(-12时区)。

SQL> INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP);已创建 1 行。

修改客户端主机的时区,改为东13区(+13时区)。

SQL> INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP);已创建 1 行。

修改客户端主机的时区,改为西3.5区(-3.5时区)。

SQL> INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP);已创建 1 行。

修改客户端主机的时区,改为东9.5区(+9.5时区)。

SQL> INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP, SYSTIMESTAMP, SYSTIMESTAMP);已创建 1 行。SQL> COMMIT;提交完成。

修改客户端主机的时区,改回东8区(+8时区)。

SQL> SELECT * FROM TEST_TIMESTAMP;TIME1-----------------------------------------------TIME2-----------------------------------------------TIME3-----------------------------------------------11-1月 -05 11.08.15.027000000 下午11-1月 -05 11.08.15.027000 下午11-1月 -05 11.08.15.0270 下午 +08:0011-1月 -05 03.11.43.746000000 下午11-1月 -05 11.11.43.746000 下午11-1月 -05 03.11.43.7460 下午 +00:0011-1月 -05 10.14.08.987000000 上午11-1月 -05 11.14.08.987000 下午11-1月 -05 10.14.08.9870 上午 -05:0011-1月 -05 03.15.01.732000000 上午11-1月 -05 11.15.01.732000 下午11-1月 -05 03.15.01.7320 上午 -12:0012-1月 -05 04.20.21.522000000 上午11-1月 -05 11.20.21.522000 下午12-1月 -05 04.20.21.5220 上午 +13:0011-1月 -05 02.15.16.567000000 下午12-1月 -05 01.45.16.567000 上午11-1月 -05 02.15.16.5670 下午 -03:3012-1月 -05 03.16.54.992000000 上午12-1月 -05 01.46.54.992000 上午12-1月 -05 03.16.54.9920 上午 +09:30已选择7行。SQL> SELECT DUMP(TIME1, 16), DUMP(TIME2, 16), DUMP(TIME3, 16) FROM TEST_TIMESTAMP;DUMP(TIME1,16)-------------------------------------------------------------DUMP(TIME2,16)-------------------------------------------------------------DUMP(TIME3,16)-------------------------------------------------------------Typ=180 Len=11: 78,69,1,b,18,9,10,1,9b,fc,c0Typ=231 Len=11: 78,69,1,b,18,9,10,1,9b,fc,c0Typ=181 Len=13: 78,69,1,b,10,9,10,1,9b,fc,c0,1c,3cTyp=180 Len=11: 78,69,1,b,10,c,2c,2c,77,e,80Typ=231 Len=11: 78,69,1,b,18,c,2c,2c,77,e,80Typ=181 Len=13: 78,69,1,b,10,c,2c,2c,77,e,80,14,3cTyp=180 Len=11: 78,69,1,b,b,f,9,3a,d4,6c,c0Typ=231 Len=11: 78,69,1,b,18,f,9,3a,d4,6c,c0Typ=181 Len=13: 78,69,1,b,10,f,9,3a,d4,6c,c0,f,3cTyp=180 Len=11: 78,69,1,b,4,10,2,2b,a1,6f,0Typ=231 Len=11: 78,69,1,b,18,10,2,2b,a1,6f,0Typ=181 Len=13: 78,69,1,b,10,10,2,2b,a1,6f,0,8,3cTyp=180 Len=11: 78,69,1,c,5,15,16,1f,1d,16,80Typ=231 Len=11: 78,69,1,b,18,15,16,1f,1d,16,80Typ=181 Len=13: 78,69,1,b,10,15,16,1f,1d,16,80,21,3cTyp=180 Len=11: 78,69,1,b,f,10,11,21,cb,bb,c0Typ=231 Len=11: 78,69,1,c,2,2e,11,21,cb,bb,c0Typ=181 Len=13: 78,69,1,b,12,2e,11,21,cb,bb,c0,11,1eTyp=180 Len=11: 78,69,1,c,4,11,37,3b,20,b8,0Typ=231 Len=11: 78,69,1,c,2,2f,37,3b,20,b8,0Typ=181 Len=13: 78,69,1,b,12,2f,37,3b,20,b8,0,1d,5a SQL> SELECT TO_NUMBER('1C', 'XXX'), TO_NUMBER('3C', 'XXX') FROM DUAL;TO_NUMBER('1C','XXX') TO_NUMBER('3C','XXX')--------------------- ---------------------                   28                    60SQL> SELECT TO_NUMBER('14', 'XXX'), TO_NUMBER('3C', 'XXX'), TO_NUMBER('143C', 'XXXXXXX') FROM DUAL;TO_NUMBER('14','XXX') TO_NUMBER('3C','XXX')--------------------- ---------------------                   20                    60SQL> SELECT TO_NUMBER('3C', 'XXX') , TO_NUMBER('1E', 'XXX'), TO_NUMBER('5A', 'XXX') FROM DUAL;TO_NUMBER('3C','XXX') TO_NUMBER('1E','XXX') TO_NUMBER('5A','XXX')--------------------- --------------------- ---------------------                   60                    30                    90

可以看出,修改时区会导致系统TIMESTAMP时间发生变化,但是对于TIMESTAMP WITH LOCAL TIME ZONE类型,总是将系统的时间转化到数据库服务器上时区的时间进行存储。
TIMESTAMP WITH TIME ZONE保存的是当前时间转化到0时区的对应的时间,并通过最后两位来保存时区信息。
第一位表示时区的小时部分。0时区用0x14表示。东n区在这个基础上加n,西n区在这个基础上减n。我们所处的东8区表示为0x1C。西5区表示为0xF。
第二位表示时区的分钟部分。标准是0x3C,即60分钟。对于东时区的半区,在这个基础上加上30分钟,如果是西时区,则减去30分钟。

更多Oracle经典案例解析: https://www.modb.pro/u/379?cyn

时区 客户 客户端 主机 时间 存储 数据 类型 基础 信息 数据库 系统 部分 格式 不同 一致 原文 小时 摘要 更多 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 亚尚软件开发有限公司 软件开发 项目组人员 区块链网络安全技术研发 三国志战略版服务器是互通的么 网络安全工作的几点思考 可做数据库的软件 不属于网络安全法条列 数据库中的元组指的是行或者记录 英国网络安全标准介绍 软件开发报价单1 数据库设计 表关联 南通市网络安全演练 长春软件开发_实力吉网传媒 数据库表一般分为几类 网络安全培训指导思想 网络安全人人知晓 二次系统网络安全监控装置 网络数通和网络安全 天津超频服务器值得推荐 深圳市聚牛网络技术有限公司 光明区正规网络技术开发价格多少 联合检查工作方案网络安全 服务器启动不了三个灯闪烁 百威网络技术有限公司是 联想服务器电源键在哪里 以下属于软件开发方法的是 乐聘网络技术有限公司招聘 广东省数字网络安全 甲基化数据库人工智能 区块链澳洲网络安全
0