Oracle中的TIMESTAMP类型[转]

原文:http://wangyaobeijing.blog.163.com/blog/static/158330320113276114762/

2 SQL> create table test_time (col_time timestamp); 3 4 表已创建。 5 6 SQL> insert into test_time values (to_timestamp('0001-1-1 0:0:0.0', 'syyyy-mm-dd hh24:mi:ss.ff')); 7 8 已创建 1 行。 9 10 SQL> insert into test_time values (to_timestamp('2000-1-1 0:0:0.0', 'syyyy-mm-dd hh24:mi:ss.ff')); 11 12 已创建 1 行。 13 14 SQL> insert into test_time values (to_timestamp('9999-12-31 23:59:59.999999', 'syyyy-mm-dd hh24:mi:ss.ff')); 15 16 已创建 1 行。 17 18 SQL> insert into test_time values (to_timestamp('-0001-1-1 0:0:0.0', 'syyyy-mm-dd hh24:mi:ss.ff')); 19 20 已创建 1 行。 21 22 SQL> insert into test_time values (to_timestamp('-0100-3-4 13:2:3.234015', 'syyyy-mm-dd hh24:mi:ss.ff')); 23 24 已创建 1 行。 25 26 SQL> insert into test_time values (systimestamp); 27 28 已创建 1 行。 29 30 31 SQL> insert into test_time values (to_timestamp('2000-1-1 0:0:0.123456789', 'syyyy-mm-dd hh24:mi:ss.ff9')); 32 33 已创建 1 行。 34 35 SQL> commit; 36 37 提交完成。 38 39 SQL> select to_char(col_time, 'syyyy-mm-dd hh24:mi:ss.ff9') time, dump(col_time) dump_time 40 2 from test_time; 41 42 TIME DUMP_TIME 43 ------------------------------ ---------------------------------------------------- 44 0001-01-01 00:00:00.000000000 Typ=180 Len=7: 100,101,1,1,1,1,1 45 2000-01-01 00:00:00.000000000 Typ=180 Len=7: 120,100,1,1,1,1,1 46 9999-12-31 23:59:59.999999000 Typ=180 Len=11: 199,199,12,31,24,60,60,59,154,198,24 47 -0001-01-01 00:00:00.000000000 Typ=180 Len=7: 100,99,1,1,1,1,1 48 -0100-03-04 13:02:03.234015000 Typ=180 Len=11: 99,100,3,4,14,3,4,13,242,201,24 49 2004-12-15 16:14:52.738000000 Typ=180 Len=11: 120,104,12,15,17,15,53,43,252,252,128 50 2000-01-01 00:00:00.123457000 Typ=180 Len=11: 120,100,1,1,1,1,1,7,91,205,232 51 52 已选择7行。 53 54 与DATE类型对比可以发现,对于TIMESTAMP类型,如果不包含微秒信息或者微秒值为0,那么存储结果和DATE完全相同。当微秒值为0时,Oracle为了节省空间,不会保存微秒信息。 55 56 如果毫秒值不为0,Oracle把微秒值当作一个9位数的数字来保存。 57 58 比如999999000,保存为59,154,198,24。234015000保存为13,242,201,24 59 60 SQL> select to_char(999999000, 'xxxxxxxxxx') from dual; 61 62 TO_CHAR(999 63 ----------- 64 3b9ac618 65 66 SQL> select to_number('3b', 'xxx') one, to_number('9a', 'xxx') two, 67 2 to_number('c6', 'xxx') three, to_number('18', 'xxx') four from dual; 68 69 ONE TWO THREE FOUR 70 ---------- ---------- ---------- ---------- 71 59 154 198 24 72 73 SQL> select to_char(234015000, 'xxxxxxxx') from dual; 74 75 TO_CHAR(2 76 --------- 77 df2c918 78 79 SQL> select to_number('d', 'xxx') one, to_number('f2', 'xxx') two, 80 2 to_number('c9', 'xxx') three, to_number('18', 'xxx') four from dual; 81 82 ONE TWO THREE FOUR 83 ---------- ---------- ---------- ---------- 84 13 242 201 24 85 86 87 88 另外,注意一点,不指定精度的情况下,TIMESTAMP默认取6位。长度超过6位,会四舍五入到6位。如果希望保存9位的TIMESTAMP,必须明确指定精度。 89 90 SQL> alter table test_time modify (col_time timestamp(9)); 91 92 表已更改。 93 94 SQL> insert into test_time values (to_timestamp('2000-1-1 0:0:0.123456789', 'syyyy-mm-dd hh24:mi:ss.ff9')); 95 96 已创建 1 行。 97 98 SQL> select to_char(col_time, 'syyyy-mm-dd hh24:mi:ss.ff9') time, dump(col_time) dump_time 99 2 from test_time; 100 101 TIME DUMP_TIME 102 ------------------------------ --------------------------------------------------- 103 0001-01-01 00:00:00.000000000 Typ=180 Len=7: 100,101,1,1,1,1,1 104 2000-01-01 00:00:00.000000000 Typ=180 Len=7: 120,100,1,1,1,1,1 105 9999-12-31 23:59:59.999999000 Typ=180 Len=11: 199,199,12,31,24,60,60,59,154,198,24 106 -0001-01-01 00:00:00.000000000 Typ=180 Len=7: 100,99,1,1,1,1,1 107 -0100-03-04 13:02:03.234015000 Typ=180 Len=11: 99,100,3,4,14,3,4,13,242,201,24 108 2004-12-15 16:14:52.738000000 Typ=180 Len=11: 120,104,12,15,17,15,53,43,252,252,128 109 2000-01-01 00:00:00.123457000 Typ=180 Len=11: 120,100,1,1,1,1,1,7,91,205,232 110 2000-01-01 00:00:00.123456789 Typ=180 Len=11: 120,100,1,1,1,1,1,7,91,205,21 111 已选择8行。

 

posted @ 2014-12-19 10:20  clown丶悠哈  阅读(109)  评论(0编辑  收藏  举报