一些同事在平常的工作中因为date和timestamp而苦恼,我觉得这两个数据类型都是关于日期的,但是有些运算还是有些不同的。date类型可以直接加减数字运算,比如:select sysdate, sysdate+ 1.2 from dual; 这个函数的意思是将现在的时间加上1.2 天,即:1天零4小时又48分钟,因此得到的结果是:sysdate: 2010-11-9 16:06:20 sysdate+1.2:2010-11-10 20:54:20。 timestamp类型比date类型更加精确了,它在秒后面又加了9位小数,即:select to_timestamp('20100908','yyyymmdd') now from dual; 结果是:08-9月 -10 12.00.00.000000000 上午。当直接加减数字时就转换为了date类型,即:to_timestamp('20100908','yyyymmdd')+1.2 得到的结果是:2010-9-9 12:00:00。
两个timestamp类型相减得到的结果地格式:day hours:minutes:seconds.000000000,即结果能够真实反映出相差多少天零多少小时、多少分、多少秒。但是两个date类型相减得到的是“天数”,要想得到相应的天数和时间还得经过运算,这里不再罗嗦了!
附上一段代码:
declare
v_result varchar2(200);
v_day varchar2(20);
v_time varchar2(20);
n_position number;
begin
v_result := to_timestamp('20100908 23:59:59', 'yyyymmdd hh24:mi:ss') -
to_timestamp('20100907 22:58:58', 'yyyymmdd hh24:mi:ss');
n_position := instr(v_result, ' ', 1, 1);
v_day := substr(v_result, 1, n_position - 1);
v_time := substr(v_result, n_position + 1);
v_time:=substr(v_time,1,length(v_time)-10);
dbms_output.put_line('相差:' || abs(to_number(v_day)) || '天又' || v_time);
end;