2013-02-26 180 views
1

我有一個會話數據表,其中包含來自Zend_Auth_Db的會話數據。Oracle使用UNIX時間戳

我想運行Oracle過程,每30秒,以檢查是否在表中修改後的字段沒有在前120秒更新一次。我有這個查詢下面應該工作,但它沒有返回正確的結果?

SELECT * FROM SESSIONDATA WHERE MODIFIED < ((SYSDATE - TO_DATE('01-JAN-1970','DD-MON-YYYY')) * (86400)) - 120;

任何人都知道我可以修改該查詢返回正確的結果?

數據庫表設置:

enter image description here

+1

什麼是正確的結果,它返回的是什麼?對該數據運行該查詢將返回所顯示的行。你確定你的意思是你想檢查它*沒有*已經更新 - 可能更有意義的是檢查*有*改變的數據(即改變'<' to a '>'),但我真的不知道什麼目前的問題是。 – 2013-02-26 09:54:31

+0

我希望查詢返回修改後的字段在最近120秒內未被修改的任何結果:) – Kal 2013-02-26 10:00:37

+0

@AlexPoole如果日期修改字段未被「修改」,我不希望返回一行,在最後120秒:) – Kal 2013-02-26 10:14:56

回答

0

試試這個:

SELECT * FROM SESSIONDATA WHERE MODIFIED BETWEEN (SYSDATE - TO_DATE('01-JAN-1970','DD-MON-YYYY')) * (86400) - 120 AND (SYSDATE - TO_DATE('01-JAN-1970','DD-MON-YYYY')) * (86400); 
+0

似乎沒有返回任何修改後的行在最近120秒內沒有被「修改」:/ – Kal 2013-02-26 10:16:50

0

與Oracle數據庫服務器是一對夫婦提前我的服務器的分鐘在我的應用程序託管。所以這兩者之間有一個奇怪的大約165秒的差異,所以它不會返回正確的結果。爲了克服此問題的問題我創建了一個觸發器,將更新修改字段中的每個更新之前SYSDATE:

create or replace 
TRIGGER "TR_UPDATE_MODIFIED" 
    before update on SESSIONDATA 
    for each row 
    begin 
    select (SYSDATE - TO_DATE('01-JAN-1970','DD-MON-YYYY')) * (86400) into :new.MODIFIED  from dual; 
end; 

這確保了時代的時間戳匹配的比較SYSDATE。