1

Zend_Auth_Dbからのセッションデータを含むsessiondataテーブルがあります。

30秒ごとにOracleプロシージャを実行して、テーブルのMODIFIEDフィールドが過去120秒間に更新されていないかどうかを確認したいと思います。以下にこのクエリがありますが、これは機能するはずですが、正しい結果が返されませんか?

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

正しい結果を返すようにそのクエリを変更する方法を知っている人はいますか?

DBテーブルの設定:

ここに画像の説明を入力してください

4

2 に答える 2

0

Oracle DB を備えたサーバーは、アプリがホストされているサーバーよりも数分進んでいました。そのため、2 つの間に約 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 に答える
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 に答える