我有一个sessiondata表,其中包含来自Zend_Auth_Db的会话数据。
我想每30秒运行一次Oracle过程来检查表中的MODIFIED字段是否在过去120秒内没有更新。我在下面有这个查询哪个应该有效,但它没有返回正确的结果?
SELECT * FROM SESSIONDATA WHERE MODIFIED < ((SYSDATE - TO_DATE('01-JAN-1970','DD-MON-YYYY')) * (86400)) - 120;
任何人都知道如何修改该查询以返回正确的结果?
数据库表设置:
答案 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匹配。