1

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

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

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

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

数据库表设置:

在此处输入图像描述

4

2 回答 2

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);
于 2013-02-26T09:58:04.860 回答
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 相匹配。

于 2013-02-26T11:05:16.953 回答