在ORACLE中存儲DATE和時間信息的話,實際上你有兩種字段數據類型的選擇(9i)。
DATE數據類型
可以存儲月,年,日,世紀,時,分和秒。度量粒度是秒
以使用TO_CHAR函數把DATE數據進行傳統地包裝,達到表示成多種格式的目的
SELECT TO_CHAR(sysdate,'MM/DD/YYYY HH24:MI:SS') "Date" FROM dual
大多數人陷入的麻煩就是計算兩個時間間的間隔年數、月數、天數、小時數和秒數。你需要明白的是,當你進行兩個日期的相減運算的時候,得到的是“帶小數位的天數”。
可以通過一個函數將天數轉換成“天時分秒”格式:
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;
TIMESTAMP 數據類型
它包括了所有DATE數據類型的年月日時分秒的信息,而且包括了小數秒的信息。
SELECT sysdate,systimestamp FROM dual
注意,to_char函數支持date和timestamp,但是trunc卻不支持TIMESTAMP數據類型。
SELECT sysdate,systimestamp,to_char(systimestamp,'yyyymmdd hh24:mi:ssxff3') FROM dual
當你直接相減的話,看看會發生什麼。結果將更容易理解,
select systimestamp-systimestamp from dual
這就意味着不用再通過麻煩的計算求出多少天多少秒,用substr函數摘取出其中的數字即可!
結論:當使用date和timestamp類型的時候,選擇是很清楚的。你可以隨意處置date和timestamp類型。當你的時間粒度必須精確至秒以下時,可以考慮使用timestamp。
再來看如何實現:將天數轉換成“天時分秒”格式:
使用DATE數據類型:
create
table t2 (d1 date,d2 date) ;
INSERT INTO T2 VALUES (SYSDATE,
SYSDATE + 1.1234);
SELECT D1, D2, D2 - D1, F_DAYS2STR(D2 - D1),
CAST(D2 AS TIMESTAMP) - CAST(D1
AS TIMESTAMP)
FROM T2
SELECT TO_NUMBER(SUBSTR(D21,
1, INSTR(D21,
' '))) D,
SUBSTR(D21, INSTR(D21, ' ') +
1,
2) H,
SUBSTR(D21, INSTR(D21, ' ') +
4,
2) M,
SUBSTR(D21, INSTR(D21, ' ') +
7,
2) S
FROM (SELECT CAST(D2 AS TIMESTAMP) -
CAST(D1 AS TIMESTAMP) D21
FROM T2)