日期:2014-05-16  浏览次数:20442 次

oracle timestamp(6)运用

我们都知道date和timestamp都是对日期和时间的表示,只是两种类型的精确度不同,前者精确到秒,后者精确到小数秒(fractional_seconds_precision),可以是 0 to 9,缺省是6。

但是对date类型的运算很简单,有很多函数可用来处理;而两个timestamp的差则是很直观地显示为多少天+多少小时+多少分钟+多少秒+多少小数秒,


SQL> create table test (T1 TIMESTAMP(6),
2 T2 TIMESTAMP(6));

表已创建。

SQL> insert into test values(
2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd hh24:mi:ss.ff'),
3 to_timestamp('2006-01-01 12:20:10.2','yyyy-mm-dd hh24:mi:ss.ff'));

已创建 1 行。

SQL>
SQL> insert into test values(
2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd hh24:mi:ss.ff'),
3 to_timestamp('2006-01-02 12:20:10.2','yyyy-mm-dd hh24:mi:ss.ff'));

已创建 1 行。

SQL>
SQL> insert into test values(
2 to_timestamp('2006-01-01 12:10:10.1','yyyy-mm-dd hh24:mi:ss.ff'),
3 to_timestamp('2006-01-02 13:40:20.2','yyyy-mm-dd hh24:mi:ss.ff'));

已创建 1 行。

SQL> commit;

提交完成。

SQL>

两个timestamp的差则是很直观地显示为多少天+多少小时+多少分钟+多少秒+多少小数秒:
SQL> select t2-t1 from test;
+000000000 00:10:00.100000
+000000001 00:10:00.100000
+000000001 01:30:10.100000

SQL>

但要简单地转化为某一个精度却比较麻烦,用类似date类型的处理方法是不行的。如转化为分:
SQL> select 1440*(t2-t1) from test;
+000000010 00:02:24.000000000
+000001450 00:02:24.000000000
+000001530 04:02:24.000000000

SQL>

发现结果根本不是原先想要的,而是在原先的“多少天+多少小时+多少分钟+多少秒+多少小数秒”的每一项都乘以1440再进行进制处理。

最容易理解的就是用substr将两个timestamp的差进行分割转化处理:

SQL>  SELECT substr((t2-t1),instr((t2-t1),' ')+7,2)         seconds,
2      substr((t2-t1),instr((t2-t1),' ')+4,2)         minutes,
3     substr((t2-t1),instr((t2-t1),' ')+1,2)         hours,
4     trunc(to_number(substr((t2-t1),1,instr(t2-t1,' '))))  days,
5     trunc(to_number(substr((t2-t1),1,instr(t2-t1,' ')))/7) weeks
6 FROM test;

SECO MINU HOUR DAYS WEEKS
---- ---- ---- ---------- ----------
00 10 00 0 0
00 10 00 1 0
10 30 01 1 0

或者利用自定义函数来实现将天数转换成“天时分秒”格式:

CREATE OR REPLACE FUNCTION F_DAYS2STR(P_DAYS IN NUMBER DEFAULT 0 )
RETURN VARCHAR2 IS
--Ver:1.0
--Created by xsb on 2005-05-26
--For: 将天数转换成天时分秒格式
DAYS NUMBER := NVL(P_DAYS,
0 );
VD NUMBER;
--
VH NUMBER;
-- 小时
VM NUMBER;
--
VS NUMBER;
--
RESULT VARCHAR2(
100 ); -- 返回值
BEGIN
VD := TRUNC(DAYS);
VH := TRUNC((DAYS - VD) *
24 );
VM := TRUNC((DAYS - VD - VH /
24 ) * 24 * 60 );
VS := TRUNC((DAYS - VD - VH /
24 - VM / 24 / 60 ) * 24 * 60 * 60 );
SELECT DECODE(VD,
0 , '' , VD || ' '