对于公元前的日期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=: bbfcc
Typ= Len=: bbfcc
Typ= Len=: bbfcccc
可以发现如果客户端和数据库中的时区是一致的那么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> COMMIT;
提交完成
修改客户端主机的时区改回东区(+时区)
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=: bbfcc
Typ= Len=: bbfcc
Typ= Len=: bbfcccc
Typ= Len=: bccce
Typ= Len=: bccce
Typ= Len=: bcccec
Typ= Len=: bbfadcc
Typ= Len=: bfadcc
Typ= Len=: bfadccfc
Typ= Len=: bbaf
Typ= Len=: bbaf
Typ= Len=: bbafc
Typ= Len=: cfd
Typ= Len=: bfd
Typ= Len=: bfdc
Typ= Len=: bfcbbbc
Typ= Len=: cecbbbc
Typ= Len=: becbbbce
Typ= Len=: cbb
Typ= Len=: cfbb
Typ= Len=: bfbbda
SQL> SELECT TO_NUMBER(C XXX) TO_NUMBER(C XXX) FROM DUAL;
TO_NUMBER(CXXX) TO_NUMBER(CXXX)
SQL> SELECT TO_NUMBER( XXX) TO_NUMBER(C XXX) TO_NUMBER(C XXXXXXX) FROM DUAL;
TO_NUMBER(XXX) TO_NUMBER(CXXX)
SQL> SELECT TO_NUMBER(C XXX) TO_NUMBER(E XXX) TO_NUMBER(A XXX) FROM DUAL;
TO_NUMBER(CXXX) TO_NUMBER(EXXX) TO_NUMBER(AXXX)
可以看出修改时区会导致系统TIMESTAMP时间发生变化但是对于TIMESTAMP WITH LOCAL TIME ZONE类型总是将系统的时间转化到数据库服务器上时区的时间进行存储
TIMESTAMP WITH TIME ZONE保存的是当前时间转化到时区的对应的时间并通过最后两位来保存时区信息
第一位表示时区的小时部分时区用x表示东n区在这个基础上加n西n区在这个基础上减n我们所处的东区表示为xC西区表示为xF
第二位表示时区的分钟部分标准是xC即分钟对于东时区的半区在这个基础上加上分钟如果是西时区则减去分钟