原文: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行。