Я пытаюсь использовать 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
Реальный вопрос вот почему это не приводит к ошибке заявления. В общем, вы не можете использовать выбранные значения в 'where'. Обычное обходное решение использует общие табличные выражения, но sqlite не поддерживает их. – keltar
Спасибо, я тоже попробовал, но получил тот же результат, извините, что я должен был упомянуть об этом ... теперь редактировал мой вопрос. – hamstar