我们都知道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.100000SQL>但要简单地转化为某一个精度却比较麻烦,用类似date类型的处理方法是不行的。如转化为分:
SQL> select 1440*(t2-t1) from test;
+000000010 00:02:24.000000000
+000001450 00:02:24.000000000
+000001530 04:02:24.000000000SQL>发现结果根本不是原先想要的,而是在原先的“多少天+多少小时+多少分钟+多少秒+多少小数秒”的每一项都乘以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 || "天") || DECODE(VH, 0, "", VH || "小时") ||DECODE(VM, 0, "", VM || "分") || DECODE(VS, 0, "", VS || "秒") INTO RESULT FROM DUAL;
RETURN(RESULT);
END;SQL>如果最后结果的精度要求不高时(在分或分以上时),就可以先将timestamp转化为date再结算,这样就简单多了:SQL> select (to_date(to_char(t2,"yyyy-mm-dd hh24:mi:ss"),"yyyy-mm-dd hh24:mi:ss"
)-to_date(to_char(t1,"yyyy-mm-dd hh24:mi:ss"),"yyyy-mm-dd hh24:mi:ss"))*24*60
2 from test;1014501530.16667date转换为timestamp:
SELECT CAST(sysdate
AS TIMESTAMP) from dual;Oracle 10g Instant ClientSHOPXX转换为Oracle相关资讯 Oracle教程
- Oracle中纯数字的varchar2类型和 (07/29/2015 07:20:43)
- Oracle教程:Oracle中查看DBLink密 (07/29/2015 07:16:55)
- [Oracle] SQL*Loader 详细使用教程 (08/11/2013 21:30:36)
| - Oracle教程:Oracle中kill死锁进程 (07/29/2015 07:18:28)
- Oracle教程:ORA-25153 临时表空间 (07/29/2015 07:13:37)
- Oracle教程之管理安全和资源 (04/08/2013 11:39:32)
|
本文评论 查看全部评论 (0)