Oracle基本数据类型存储格式浅析—日期类型(1)

Oracle基本数据类型存储格式浅析—日期类型(1),第1张

Oracle基本数据类型存储格式浅析(三)——日期类型     下面通过一个例子进行说明

SQL>create table test_date (date_col date)

表已创建

SQL>insert into test_date values (to_date( : : yyyy mm dd hh :mi:ss ))

已创建 行

SQL>insert into test_date values (to_date( : : yyyy mm dd hh :mi:ss ))

已创建 行

SQL>insert into test_date values (to_date( : : syyyy mm dd hh :mi:ss ))

已创建 行

SQL>insert into test_date values (to_date( : : syyyy mm dd hh :mi:ss ))

已创建 行

SQL>insert into test_date values (to_date( : : syyyy mm dd hh :mi:ss ))

已创建 行

SQL>insert into test_date values (to_date( : : syyyy mm dd hh :mi:ss ))

已创建 行

SQL>insert into test_date values (sysdate)

已创建 行

SQL>insert into test_date values (to_date( : : syyyy mm dd hh :mi:ss ))insert into test_date values (to_date( : : syyyy mm dd hh :mi:ss ))*ERROR 位于第 行:ORA : (全)年度值必须介于 和 + 之间 且不为

SQL>insert into test_date values (to_date( : : yyyy mm dd hh :mi:ss ))insert into test_date values (to_date( : : yyyy mm dd hh :mi:ss ))*ERROR 位于第 行:ORA : (全)年度值必须介于 和 + 之间 且不为

SQL>col dump_date format a SQL>select to_char(date_col syyyy mm dd hh :mi:ss ) dump(date_col) dump_date from test_date

TO_CHAR(DATE_COL SY DUMP_DATE : : Typ= Len= : : : Typ= Len= : : : Typ= Len= : : : Typ= Len= : : : Typ= Len= : : : Typ= Len= : : : Typ= Len= :

已选择 行

通过最后两条语句已经可以看出Oracle的DATE类型的取值范围是公元 年 月 日至公元 年 月 日 而且根据日期的特定 要不然是公元 年 要不然是公元前 年 不会出现 年的情况

日期类型长度是 个字节分别表示世纪 年 月 日 时 分和秒

由于不会出现 的情况 月和日都是按照原值存储的 月的范围是 ~ 日的范围是 ~

由于时 分 秒都会出现 的情况 因此存储时采用原值加 的方式 时保存为 时保存为 时保存为 分和秒的情况与小时类似 小时的范围是 ~ 在数据库中以 ~ 保存 分和秒的范围都是 ~ 在数据库中以 ~ 保存

年和世纪的情况相对比较复杂 可分为公元前和公元后两种情况 由于最小的世纪的值是 (公元前 年) 最大值是 (公元 年) 为了避免负数的产生 oracle把世纪加 保存在数据库中 公元 年 世纪保存为 公元 年 世纪保存为 公元前 年 世纪保存为 ( +( )) 公元前 年 世纪保存为 ( +( ))

注意 对于公元前 年 虽然已经是公元前了 但是表示世纪的前两位的值仍然是 因此 这时的保存的世纪的值仍然是 世纪的范围是 ~ 保存的值是 ~

年的保存与世纪的保存方式类似 也把年的值加上 进行保存 对于公元 年 年保持为 公元 年保存为 公元 年保存为 公元 年保存为 公元前 年 保存为 ( +( )) 公元前 年 保存为 ( +( )) 公元前 年保存为 ( +( )) 对于公元前的年 保存的值总是小于等于 对于公元后的年 保存的值总是大于等于 年的范围是 ~ 保存的值是 ~

lishixinzhi/Article/program/Oracle/201311/18156

对于公元前的日期 Oracle从 开始保存 公元前的年的保存的值和对应的公元后的年的值相加的和是 如上例中的公元 年和公元前 年的值相加 + = + =

SQL中DATE类型最后还包括一个 似乎目前没有使用

SQL>CREATE TABLE TEST_TIMESTAMP(TIME TIMESTAMP( ) TIME TIMESTAMP( ) WITH LOCAL TIME ZONE TIME TIMESTAMP( ) WITH TIME ZONE)

表已创建

SQL>INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP SYSTIMESTAMP SYSTIMESTAMP)

已创建 行

SQL>SELECT * FROM TEST_TIMESTAMP

TIME TIME TIME 月 下午 月 下午 月 下午 + :

SQL>SELECT DUMP(TIME ) DUMP(TIME ) DUMP(TIME ) FROM TEST_TIMESTAMP

DUMP(TIME ) DUMP(TIME ) DUMP(TIME ) Typ= Len= : b b fc c Typ= Len= : b b fc c Typ= Len= : b b fc c c c

可以发现 如果客户端和数据库中的时区是一致的 那么TIMESTAMP和TIMESTAMP WITH LOCAL TIME ZONE存储的数据是完全一样的

TIMESTAMP WITH TIME ZONE则略有不同 它保存的是 时区的时间 和所处的时区信息

修改客户端主机的时区 由东 区(+ 区)改为 时区

SQL>INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP SYSTIMESTAMP SYSTIMESTAMP)

已创建 行

修改客户端主机的时区 改为西 区( 时区)

SQL>INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP SYSTIMESTAMP SYSTIMESTAMP)

已创建 行

修改客户端主机的时区 改为西 区( 时区)

SQL>INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP SYSTIMESTAMP SYSTIMESTAMP)

已创建 行

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

SQL>INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP SYSTIMESTAMP SYSTIMESTAMP)

已创建 行

修改客户端主机的时区 改为西 区( 时区)

SQL>INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP SYSTIMESTAMP SYSTIMESTAMP)

已创建 行

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

SQL>INSERT INTO TEST_TIMESTAMP VALUES (SYSTIMESTAMP SYSTIMESTAMP SYSTIMESTAMP)

已创建 行

SQL>MIT

提交完成

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

SQL>SELECT * FROM TEST_TIMESTAMP

TIME TIME TIME 月 下午 月 下午 月 下午 + :

月 下午 月 下午 月 下午 + :

月 上午 月 下午 月 上午 :

月 上午 月 下午 月 上午 :

月 上午 月 下午 月 上午 + :

月 下午 月 上午 月 下午 :

月 上午 月 上午 月 上午 + :

已选择 行

SQL>SELECT DUMP(TIME ) DUMP(TIME ) DUMP(TIME ) FROM TEST_TIMESTAMP

DUMP(TIME ) DUMP(TIME ) DUMP(TIME ) Typ= Len= : b b fc c Typ= Len= : b b fc c Typ= Len= : b b fc c c c

Typ= Len= : b c c c e Typ= Len= : b c c c e Typ= Len= : b c c c e c

Typ= Len= : b b f a d c c Typ= Len= : b f a d c c Typ= Len= : b f a d c c f c

Typ= Len= : b b a f Typ= Len= : b b a f Typ= Len= : b b a f c

Typ= Len= : c f d Typ= Len= : b f d Typ= Len= : b f d c

Typ= Len= : b f cb bb c Typ= Len= : c e cb bb c Typ= Len= : b e cb bb c e

Typ= Len= : c b b Typ= Len= : c f b b Typ= Len= : b f b b d a

SQL>SELECT TO_NUMBER( C XXX ) TO_NUMBER( C XXX ) FROM DUAL

TO_NUMBER( C XXX ) TO_NUMBER( C XXX )

SQL>SELECT TO_NUMBER( XXX ) TO_NUMBER( C XXX ) TO_NUMBER( C XXXXXXX ) FROM DUAL

TO_NUMBER( XXX ) TO_NUMBER( C XXX )

SQL>SELECT TO_NUMBER( C XXX ) TO_NUMBER( E XXX ) TO_NUMBER( A XXX ) FROM DUAL

TO_NUMBER( C XXX ) TO_NUMBER( E XXX ) TO_NUMBER( A XXX )

可以看出 修改时区会导致系统TIMESTAMP时间发生变化 但是对于TIMESTAMP WITH LOCAL TIME ZONE类型 总是将系统的时间转化到数据库服务器上时区的时间进行存储

TIMESTAMP WITH TIME ZONE保存的是当前时间转化到 时区的对应的时间 并通过最后两位来保存时区信息

第一位表示时区的小时部分 时区用 x 表示 东n区在这个基础上加n 西n区在这个基础上减n 我们所处的东 区表示为 x C 西 区表示为 xF

lishixinzhi/Article/program/Oracle/201311/18690


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/sjk/9891785.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-03
下一篇 2023-05-03

发表评论

登录后才能评论

评论列表(0条)

保存