Oracle使用UNIX时间戳

时间:2013-02-26 09:16:09

标签: oracle zend-framework session unix-timestamp

我有一个sessiondata表,其中包含来自Zend_Auth_Db的会话数据。

我想每30秒运行一次Oracle过程来检查表中的MODIFIED字段是否在过去120秒内没有更新。我在下面有这个查询哪个应该有效,但它没有返回正确的结果?

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

任何人都知道如何修改该查询以返回正确的结果?

数据库表设置:

enter image description here

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

使用Oracle DB的服务器比我的应用程序托管服务器提前几分钟。所以两者之间有一个奇怪的大约165秒的差异,所以它不会返回正确的结果。为了克服这个问题,我创建了一个触发器,在每次更新之前将MODIFIED字段更新为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匹配。