2013-02-26 182 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。