我們都知道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 ||
'
天
'
) || 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;
10
1450
1530.16667
date轉換爲timestamp:
SELECT CAST (sysdate AS TIMESTAMP ) from dual;