oracle 各資料型別dump說明(二)

selectshen發表於2016-02-04
    這一節主要介紹 TIMESTAMP,TIMESTAMP WITH TIME ZONE,TIMESTAMP WITH LOCAL TIME ZONE,INTERVAL YEAR TO MONTH,INTERVAL DAY TO SECOND,RAW型別.

環境:
os:centos 6.6
db version:11.2.0.4

#檢視地區語言字符集資訊
select * from v$nls_parameters;
/*
PARAMETER    VALUE
NLS_LANGUAGE    AMERICAN
NLS_TERRITORY    AMERICA
NLS_CURRENCY    $
NLS_ISO_CURRENCY    AMERICA
NLS_NUMERIC_CHARACTERS    .,
NLS_CALENDAR    GREGORIAN
NLS_DATE_FORMAT    DD-MON-RR
NLS_DATE_LANGUAGE    AMERICAN
NLS_CHARACTERSET    AL32UTF8
NLS_SORT    BINARY
NLS_TIME_FORMAT    HH.MI.SSXFF AM
NLS_TIMESTAMP_FORMAT    DD-MON-RR HH.MI.SSXFF AM
NLS_TIME_TZ_FORMAT    HH.MI.SSXFF AM TZR
NLS_TIMESTAMP_TZ_FORMAT    DD-MON-RR HH.MI.SSXFF AM TZR
NLS_DUAL_CURRENCY    $
NLS_NCHAR_CHARACTERSET    AL16UTF16
NLS_COMP    BINARY
NLS_LENGTH_SEMANTICS    BYTE
NLS_NCHAR_CONV_EXCP    FALSE
*/

#建測試表,裡面定義TIMESTAMP,TIMESTAMP WITH TIME ZONE,TIMESTAMP WITH LOCAL TIME ZONE,INTERVAL YEAR TO MONTH,INTERVAL DAY TO SECOND,RAW型別.
create table SCOTT.TB_TYPE02
(
  t_timestmap     TIMESTAMP(6),
  t_timestmap_tz  TIMESTAMP(6) WITH TIME ZONE,
  t_timestmap_ltz TIMESTAMP(6) WITH LOCAL TIME ZONE,
  t_interval_ytm  INTERVAL YEAR(2) TO MONTH,
  t_interval_dts  INTERVAL DAY(2) TO SECOND(6),
  t_raw           RAW(10)
);

#插入測試資料
insert into SCOTT.TB_TYPE02
select current_timestamp,current_timestamp,current_timestamp,INTERVAL '12-2' YEAR(2) TO MONTH,INTERVAL '12 00:00:01' DAY(2) TO SECOND(6),
utl_raw.cast_to_raw('selectshen') from dual;
commit;
 
#timestamp型別
#timestamp型別為固定長度,根據是否儲存毫秒len=11或len=7,有毫秒位沒有時區,內部型別號Typ=180
#前七個位元組存放年月日時分秒,同data型別,前兩個位元組為世紀和年,世紀和年儲存是有加100,接下來兩個位元組是月和日,最後三個位元組是24小時格式的時分秒,時分秒儲存是都有加1.
#後四個位元組存放毫秒,毫秒位儲存的16進位制值合併後轉為10進位制即為毫秒值
select t_timestmap,dump(t_timestmap),dump(t_timestmap,16) from SCOTT.TB_TYPE02;
/*
T_TIMESTMAP    DUMP(T_TIMESTMAP)    DUMP(T_TIMESTMAP,16)
04-FEB-16 02.37.37.825548 PM    Typ=180 Len=11: 120,116,2,4,15,38,38,49,52,220,224    Typ=180 Len=11: 78,74,2,4,f,26,26,31,34,dc,e0
*/
#04-FEB-16 02.37.37.825548 PM=120,116,2,4,15,38,38,49,52,220,224(十進位制),其中世紀120-100=20,年=116-100=16,月=2,日=4,時=15-1=14,分=38-1=37,秒=38-1=37
#04-FEB-16 02.37.37.825548 PM=78,74,2,4,f,26,26,31,34,dc,e0(十六進位制)
毫秒位十進位制49,52,220,224=十六進位制31,34,dc,e0
select to_number('3134dce0','xxxxxxxx') from dual;
/*
TO_NUMBER('3134DCE0','XXXXXXXX'
825548000
*/
小數位825548000->0.825548000=0.825548

#可以看到,如果把t_timestmap更新為sysdate,長度len=7,不儲存毫秒
update SCOTT.TB_TYPE02 set t_timestmap=sysdate;
select t_timestmap,dump(t_timestmap) from SCOTT.TB_TYPE02;
/*
T_TIMESTMAP    DUMP(T_TIMESTMAP)
04-FEB-16 02.39.17.000000 PM    Typ=180 Len=7: 120,116,2,4,15,40,18
*/


#TIMESTAMP WITH TIME ZONE型別
#TIMESTAMP WITH TIME ZONE型別為固定長度len=13,有毫秒位和時區,內部型別號Typ=181
#前七個位元組存放年月日時分秒,同data型別,前兩個位元組為世紀和年,世紀和年儲存是有加100,接下來兩個位元組是月和日,最後三個位元組是24小時格式的時分秒,時分秒儲存是都有加1.
#接下來四個位元組存放毫秒,毫秒位儲存的16進位制值合併後轉為10進位制即為毫秒值
#最後兩個位元組存放時區小時和時區分鐘
select t_timestmap_tz,dump(t_timestmap_tz),DUMP(t_timestmap_tz,16)from SCOTT.TB_TYPE02;
/*
T_TIMESTMAP_TZ    DUMP(T_TIMESTMAP_TZ)    DUMP(T_TIMESTMAP_TZ,16)
04-FEB-16 02.31.35.276282 PM +08:00    Typ=181 Len=13: 120,116,2,4,7,32,36,16,119,186,144,28,60    Typ=181 Len=13: 78,74,2,4,7,20,24,10,77,ba,90,1c,3c
*/
#04-FEB-16 02.31.35.276282 PM +08:00=120,116,2,4,7,32,36,16,119,186,144,28,60(十進位制)
年月時分秒演算法同TIMESTAMP型別,略.
時區小時=倒數第二個位元組-20=28-20=+8,時區分鐘=倒數第一個位元組-60=60-60=0.
算出來的時間是2016-02-04 6:31:35.276282加上時區小時和分就是2016-02-04 14:31:35.276282=04-FEB-16 02.31.35.276282 PM +08:00


#TIMESTAMP WITH LOCAL TIME ZONE型別
#TIMESTAMP WITH LOCAL TIME ZONE型別為固定長度len=11,有毫秒位,內部型別號Typ=231
#它儲存在資料庫中的是時區小時0時區分鐘0的時間,會透過當前會話的時區顯示時間
#前七個位元組存放年月日時分秒,同data型別,前兩個位元組為世紀和年,世紀和年儲存是有加100,接下來兩個位元組是月和日,最後三個位元組是24小時格式的時分秒,時分秒儲存是都有加1.
#接下來四個位元組存放毫秒,毫秒位儲存的16進位制值合併後轉為10進位制即為毫秒值
select t_timestmap_ltz,dump(t_timestmap_ltz),dump(t_timestmap_ltz,16) from SCOTT.TB_TYPE02;
/*
T_TIMESTMAP_LTZ    DUMP(T_TIMESTMAP_LTZ)    DUMP(T_TIMESTMAP_LTZ,16)
04-FEB-16 02.31.35.276282 PM    Typ=231 Len=11: 120,116,2,4,7,32,36,16,119,186,144    Typ=231 Len=11: 78,74,2,4,7,20,24,10,77,ba,90
*/
#上面並不有時區資訊,dump中儲存的是6點,顯示的時間是下午2點,因為當前會話時區+8:00


#INTERVAL YEAR TO MONTH型別
#INTERVAL YEAR TO MONTH型別固定長度len=5,內部型別號Typ=182.
#前四個位元組存放年,dump的值有加0x80000000
#最後一個位元組存放月,dump的值有加60
select t_interval_ytm,dump(t_interval_ytm) from SCOTT.TB_TYPE02;
/*
T_INTERVAL_YTM    DUMP(T_INTERVAL_YTM)
+12-02    Typ=182 Len=5: 128,0,0,12,62
*/

#INTERVAL DAY TO SECOND型別
#INTERVAL DAY TO SECOND型別固定長度len=11,內部型別號Typ=183
#前四個位元組存放天,dump的值有加0x80000000
#接下來三個位元組存放時分秒,dump的值有各加60
#最後四個位元組存放毫秒,dump的值有加0x80000000
select t_interval_dts,dump(t_interval_dts) from SCOTT.TB_TYPE02;
/*
T_INTERVAL_DTS    DUMP(T_INTERVAL_DTS)
+12 00:00:01.000000    Typ=183 Len=11: 128,0,0,12,60,60,61,128,0,0,0
*/

#raw型別
#raw型別存放二進位制資料,可變長度,最大長度2000位元組,部型別號Typ=23
#顯示的值和dump的16程式值相同
select t_raw,dump(t_raw),dump(t_raw,16) from SCOTT.TB_TYPE02;
/*
T_RAW    DUMP(T_RAW)    DUMP(T_RAW,16)
73656C6563747368656E    Typ=23 Len=10: 115,101,108,101,99,116,115,104,101,110    Typ=23 Len=10: 73,65,6c,65,63,74,73,68,65,6e
*/



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/28539951/viewspace-1986441/,如需轉載,請註明出處,否則將追究法律責任。

相關文章