分类: Oracle
2008-05-23 20:22:38
|
这篇文章描述TIMESTAMP类型的数据在Oracle中是以何种格式存放的。 下面通过一个例子进行说明。
SQL> create table test_time (col_time timestamp); 表已创建。 SQL> insert into test_time values (to_timestamp('0001-1-1 0:0:0.0', 'syyyy-mm-dd hh24:mi:ss.ff')); 已创建 1 行。 SQL> insert into test_time values (to_timestamp('2000-1-1 0:0:0.0', 'syyyy-mm-dd hh24:mi:ss.ff')); 已创建 1 行。 SQL> insert into test_time values (to_timestamp('9999-12-31 23:59:59.999999', 'syyyy-mm-dd hh24:mi:ss.ff')); 已创建 1 行。 SQL> insert into test_time values (to_timestamp('-0001-1-1 0:0:0.0', 'syyyy-mm-dd hh24:mi:ss.ff')); 已创建 1 行。 SQL> insert into test_time values (to_timestamp('-0100-3-4 13:2:3.234015', 'syyyy-mm-dd hh24:mi:ss.ff')); 已创建 1 行。 SQL> insert into test_time values (systimestamp); 已创建 1 行。
已创建 1 行。 SQL> commit; 提交完成。 SQL> select to_char(col_time, 'syyyy-mm-dd hh24:mi:ss.ff9') time, dump(col_time) dump_time TIME DUMP_TIME 已选择7行。 与DATE类型对比可以发现,对于TIMESTAMP类型,如果不包含微秒信息或者微秒值为0,那么存储结果和DATE完全相同。当微秒值为0时,Oracle为了节省空间,不会保存微秒信息。 如果毫秒值不为0,Oracle把微秒值当作一个9位数的数字来保存。 比如999999000,保存为59,154,198,24。234015000保存为13,242,201,24。 SQL> select to_char(999999000, 'xxxxxxxxxx') from dual; TO_CHAR(999 SQL> select to_number('3b', 'xxx') one, to_number('9a', 'xxx') two, ONE TWO THREE FOUR SQL> select to_char(234015000, 'xxxxxxxx') from dual; TO_CHAR(2 SQL> select to_number('d', 'xxx') one, to_number('f2', 'xxx') two, ONE TWO THREE FOUR
另外,注意一点,不指定精度的情况下,TIMESTAMP默认取6位。长度超过6位,会四舍五入到6位。如果保存9位的TIMESTAMP,必须明确指定精度。 SQL> alter table test_time modify (col_time timestamp(9)); 表已更改。 SQL> insert into test_time values (to_timestamp('2000-1-1 0:0:0.123456789', 'syyyy-mm-dd hh24:mi:ss.ff9')); 已创建 1 行。 SQL> select to_char(col_time, 'syyyy-mm-dd hh24:mi:ss.ff9') time, dump(col_time) dump_time TIME DUMP_TIME 已选择8行。 |
chinaunix网友2008-12-19 09:58:48
oracle9i winxp下, select to_timestamp('2000-1-1 0:0:0.123456789', 'syyyy-mm-dd hh24:mi:ss.ff9') from dual; 提示ora-01821: date format not recognized