2012-06-24 100 views
2

我真的很難找出如何使用ORACLE查找過去12小時內的某些記錄。我想在下面的陳述結尾添加時間檢查:查找過去12小時的oracle記錄

SELECT ND_TICKET.TICKET_ID, ND_TICKET.PRIORITY, ND_TICKET.PROBLEM_SUMMARY 
    FROM ARADMIN.ND_TICKET 
     INNER JOIN SUPPORT_AREA 
       ON (ND_TICKET.SUPPORT_AREA_ID = SUPPORT_AREA.SUPPORT_AREA_ID) 
WHERE REGEXP_LIKE(SUPPORT_AREA.SUPPORT_AREA_NAME,'National\s+Technical') 
    AND ND_TICKET.PRIORITY IN(0, 1) 

我看了不少地方,但沒有一個真的對我有任何意義。

我有一個名爲TTR_START的列,它存儲自1970年1月1日以來(即Unix時間)的秒數,我想用它來進行此日期比較。

+0

有您存儲在插入日期的任何列? – Sebas

+0

@Sebas - 日期存儲在處於紀元時間的TTR_START中。 – jmg0880

+0

在Oracle中沒有數據類型「紀元時間」 –

回答

4

如果ttr_start是一個數字,是Unix時間(秒自1970年1月1日),

AND date '1970-01-01' + nutodsinterval(ttr_start, 'SECOND') >= 
     sysdate - interval '12' hour 

應該工作。

如果在ttr_date的指數,很可能會更有效地走另一條路和12小時前的日期轉換爲數字

AND ttr_start >= ((sysdate - interval '12' hour) - date '1970-01-01')*24*60*60 

而不是在每個SQL語句中嵌入這些計算,我會假設你想定義一些實用函數來在實際日期和你的數字數據之間進行轉換。像

CREATE FUNCTION epoch_to_date(p_epoch_num IN NUMBER) 
    RETURN DATE 
IS 
    l_dt DATE; 
BEGIN 
    l_dt := date '1970-01-01' + numtodsinterval(p_epoch_num, 'SECOND'); 
    RETURN l_dt; 
END; 

CREATE FUNCTION date_to_epoch(p_dt IN DATE) 
    RETURN NUMBER 
IS 
    l_epoch_num NUMBER; 
BEGIN 
    l_epoch_num := (p_dt - date '1970-01-01')*24*60*60; 
    RETURN l_epoch_num; 
END; 

東西之後,你的查詢可能是

AND epoch_to_date(ttr_start) >= sysdate - interval '12' hour 

AND ttr_start >= date_to_epoch(sysdate - interval '12' hour) 
+0

嘗試過它並得到以下錯誤。'17:54:13 [SELECT - 0 row(s),0.000 secs] [錯誤代碼:932,SQL狀態:42000] ORA-00932:不一致的數據類型:期望NUMBER得到DATE'這是因爲曆元時間和SYSDATE中的實時? – jmg0880

+0

@ jmg0880 - 在您的評論中錯過了您將日期存儲在「NUMBER」數據類型中的事實。你沒有指定你使用的是什麼時代,所以我猜你的意思是你使用的是Unix時代,並且你存儲了自1970年1月1日以來的秒數。 –

+0

非常感謝你!這工作完美!你太棒了。 – jmg0880

相關問題