Oracle 日期類型timestamp(時間戳)和date類型使用


1、獲取系統時間的語句(ssxff6獲取小數點后面六位)  
select sysdate,systimestamp,to_char(systimestamp, 'yyyymmdd hh24:mi:ssxff6'), 
  to_char(systimestamp, 'yyyymmdd hh24:mi:ss.ff6') from dual;  

2、字符型轉成timestamp 
select to_timestamp('2011-09-14 12:52:42.123456789', 'syyyy-mm-dd hh24:mi:ss.ff') from dual; 

3、timestamp轉成date型  
select cast(to_timestamp('2011-09-14 12:52:42.123456789', 'syyyy-mm-dd hh24:mi:ss.ff') as date) timestamp_to_date from dual;  

4、date型轉成timestamp  
select cast(sysdate as timestamp) date_to_timestamp from dual;  

5、兩date的日期相減得出的是天數,而兩timestamp的日期相減得出的是完整的年月日時分秒小數秒  
select sysdate-sysdate,systimestamp-systimestamp from dual; 

select extract(day from inter) * 24 * 60 * 60 +   
  extract(hour from inter) * 60 * 60 + extract(minute from inter) * 60 +   
    extract(second from inter) "seconds" from 

  select to_timestamp('2011-09-14 12:34:23.281000000', 'yyyy-mm-dd hh24:mi:ss.ff') -   
    to_timestamp('2011-09-14 12:34:22.984000000', 'yyyy-mm-dd hh24:mi:ss.ff') inter from dual 
); 

select extract(second from to_timestamp('2011-09-14 12:34:23.281000000', 'yyyy-mm-dd hh24:mi:ss.ff'))- 
  extract(second from to_timestamp('2011-09-14 12:34:22.984000000', 'yyyy-mm-dd hh24:mi:ss.ff')) from dual; 

注:所以,timestamp要算出兩日期間隔了多少秒,要用函數轉換一下。 
to_char函數支持date和timestamp,但是trunc卻不支持TIMESTAMP數據類型。 

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函數支持datetimestamp,但是trunc卻不支持TIMESTAMP數據類型。

SELECT sysdate,systimestamp,to_char(systimestamp,'yyyymmdd hh24:mi:ssxff3') FROM dual

當你直接相減的話,看看會發生什么。結果將更容易理解,

select systimestamp-systimestamp from dual

這就意味着不用再通過麻煩的計算求出多少天多少秒,用substr函數摘取出其中的數字即可!

結論:當使用datetimestamp類型的時候,選擇是很清楚的。你可以隨意處置datetimestamp類型。當你的時間粒度必須精確至秒以下時,可以考慮使用timestamp

再來看如何實現:將天數轉換成“天時分秒”格式:

使用DATE數據類型:

create table t2 (d1 date,d2 date) ;
INSERT INTO T2 VALUES (SYSDATESYSDATE + 
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, 
' ') + 12) H,
            SUBSTR(D21, INSTR(D21, 
' ') + 42) M,
            SUBSTR(D21, INSTR(D21, 
' ') + 72) S
    FROM (SELECT CAST(D2 AS TIMESTAMP) - CAST(D1 AS TIMESTAMP) D21
           FROM T2)
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函數支持datetimestamp,但是trunc卻不支持TIMESTAMP數據類型。

SELECT sysdate,systimestamp,to_char(systimestamp,'yyyymmdd hh24:mi:ssxff3') FROM dual

當你直接相減的話,看看會發生什么。結果將更容易理解,

select systimestamp-systimestamp from dual

這就意味着不用再通過麻煩的計算求出多少天多少秒,用substr函數摘取出其中的數字即可!

結論:當使用datetimestamp類型的時候,選擇是很清楚的。你可以隨意處置datetimestamp類型。當你的時間粒度必須精確至秒以下時,可以考慮使用timestamp

再來看如何實現:將天數轉換成“天時分秒”格式:

使用DATE數據類型:

create table t2 (d1 date,d2 date) ;
INSERT INTO T2 VALUES (SYSDATESYSDATE + 
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, 
' ') + 12) H,
            SUBSTR(D21, INSTR(D21, 
' ') + 42) M,
            SUBSTR(D21, INSTR(D21, 
' ') + 72) S
    FROM (SELECT CAST(D2 AS TIMESTAMP) - CAST(D1 AS TIMESTAMP) D21
           FROM T2)







免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM