2013-09-11 1 views
0

Я пытаюсь использовать SQLite-запрос для расчета, когда сигнал тревоги должен стать активным. Я сохраняю время начала и фиксацию (тайм-аут или задержка до того, как будильник активируется) в той же таблице, что и секунды. Вот схема:SQLite игнорирует вычисления, используемые с оператором WHERE

CREATE TABLE alarm_log (
scope integer NOT NULL, --REFERENCES scopes_inst(inst) 
start integer NOT NULL, -- seconds 
end integer, 
severity text NOT NULL, 
value text NOT NULL, 
details text, 
raised_by integer,  -- the scope id that raised the alarm 
detent integer,   -- detent in seconds 
PRIMARY KEY (scope, start) 
); 

А вот запрос, который я пытаюсь использовать, чтобы активные аварийные сигналы, используя некоторые простые математические:

SELECT *, 
    (start + detent) AS activated, -- the time that the alarm becomes active 
    STRFTIME("%s","now") AS now -- the current time of the query 
FROM alarm_log 
WHERE end IS NULL 
AND now > activated;    -- ensure that the alarm is activated 

Я создал тревогу с защелкой 30 секунд. Время начала составляет 1378870712, поэтому оно должно активироваться на уровне 1378870742 (см. Активированный столбец).

Это пример вышеупомянутого запроса возвращающегося Строки с 4 секунд до времени активированного ...

scope  start  end   severity value     details   raised_by detent  activated now  
---------- ---------- ---------- ---------- --------------------- ---------------- ---------- ---------- ---------- ---------- 
4   1378870712    warning  out-of-range too-high min 500 max 1500 0   30   1378870742 1378870738 

Теперь тот же запрос возвращает эту строку 2 секунды после того, как сигнал был активирован.

scope  start  end   severity value     details   raised_by detent  activated now  
---------- ---------- ---------- ---------- --------------------- ---------------- ---------- ---------- ---------- ---------- 
4   1378870712    warning  out-of-range too-high min 500 max 1500 0   30   1378870742 1378870744 

я ожидал бы реверсирования > на последней строке на < он должен показывать сигналы тревоги, которые не активны ... но это ничего не возвращает, до или после того, как время проходит стопора ...

Это нормальное поведение? Запрос выглядит хорошо для меня. Спасибо за чтение :)

EDIT:

Я должен отметить, что я пробовал с расчетами прямо в ИНЕКЕ, но он делает то же самое :(

SELECT *, 
    (start + detent) AS activated, -- the time that the alarm becomes active 
    STRFTIME("%s","now") AS now -- the current time of the query 
FROM alarm_log 
WHERE end IS NULL 
AND STRFTIME("%s","now") > (start + detent); 

EDIT2:

Вот некоторые тестовые данные:

SQLite стили:

scope|start|end|severity|value|details|raised_by|detent 
4|1378935271|1378935842|warning|out-of-range too-high|min 500 max 1500|0|600 
4|1378935854|1378935876|warning|out-of-range too-high|min 500 max 1500|0|600 
4|1378935884||warning|out-of-range too-high|min 500 max 1500|0|600 

стили CSV

scope,start,end,severity,value,details,raised_by,detent 
4,1378935271,1378935842,warning,out-of-range too-high,min 500 max 1500,0,600 
4,1378935854,1378935876,warning,out-of-range too-high,min 500 max 1500,0,600 
4,1378935884,,warning,out-of-range too-high,min 500 max 1500,0,600 
+0

Реальный вопрос вот почему это не приводит к ошибке заявления. В общем, вы не можете использовать выбранные значения в 'where'. Обычное обходное решение использует общие табличные выражения, но sqlite не поддерживает их. – keltar

+0

Спасибо, я тоже попробовал, но получил тот же результат, извините, что я должен был упомянуть об этом ... теперь редактировал мой вопрос. – hamstar

ответ

1

Попробуйте это:

select * from (
    select *, (start + detent) as activated, 
    strftime("%s","now") as now 
    from alarm_log where end is null 
) where cast(now as int) > activated; 
+0

Спасибо за предложение, но мне не повезло. Делает то же самое, что и исходные запросы. – hamstar

+0

У меня есть обновленный запрос, проверьте его. Если он все еще не работает, укажите данные примера. – keltar

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