2013-02-26 2 views
1

У меня есть таблица sessiondata с данными сеанса из Zend_Auth_Db.Oracle работает с отметкой времени UNIX

Я хочу запустить процедуру Oracle каждые 30 секунд, чтобы проверить, не изменилось ли поле MODIFIED в таблице за последние 120 секунд. У меня есть этот запрос ниже, который должен работать, но он не возвращает правильные результаты?

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

Каждый знает, как я могу изменить этот запрос, чтобы вернуть правильные результаты?

DB таблица создана:

enter image description here

+1

Каковы правильные результаты и чем они вернутся вместо этого? Выполнение этого запроса в отношении этих данных возвращает строку, которую вы показываете. Вы уверены, что хотите проверить, что он * не был обновлен, может быть больше смысла проверять данные, которые * * изменились (т. Е. Изменить «<' to a '>»), но я действительно не уверен, что проблема в данный момент. –

+0

Я хочу, чтобы запрос возвращал любые результаты, когда измененное поле не было изменено за последние 120 секунд :) – Kal

+0

@AlexPoole Я не хочу, чтобы строка возвращалась, если поле с измененной датой не было «изменено», за последние 120 секунд :) – Kal

ответ

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

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 в сравнении.

Смежные вопросы