Как получить данные за последние 6 часов, используя sqllite - PullRequest
0 голосов
/ 07 ноября 2018

Код:

.mode column
.width 40 20 20 6 10 90
.headers off
select name, datetime("start time","unixepoch","localtime"), datetime("end time","unixepoch","localtime"), "end time"-"start time", "completion status", "failed clients list"
from  "savegroup job"
where datetime("end time","unixepoch","localtime") >= datetime("now", "-6 hours")
and "completion status" like "%failed%";

>= datetime("now", "-6 hours") не работает.

Мне нужно получить последние входные данные за последние 6 часов.

Спасибо

1 Ответ

0 голосов
/ 08 ноября 2018

Я полагаю, что ваша проблема, скорее всего, состоит в том, что значения в столбцах время начала и время окончания не сохранены в правильном формате. То есть для применения модификатора unixepoch , тогда значения ДОЛЖНЫ быть в формате DDDDDDDDDD.

Согласно: -

Модификатор unixepoch (11) работает только в том случае, если он следует сразу за временная строка в формате DDDDDDDDDD. Этот модификатор вызывает DDDDDDDDDD следует интерпретировать не как номер юлианского дня, как обычно было бы, но как Unix Time - количество секунд с 1970 года. Если модификатор "unixepoch" не следует временной шкале формы DDDDDDDDDD, который выражает количество секунд с 1970 года или если другие модификаторы отделяют модификатор "unixepoch" от предыдущего DDDDDDDDDD, то поведение не определено. Для версий SQLite до 3.16.0 (2017-01-02), модификатор "unixepoch" работает только для дат между 0000-01-01 00:00:00 и 5352-11-01 10:52:47 (время Unix От -62167219200 до 106751991167).

SQL как понял SQLite - Функции даты и времени - Модификаторы

Например, рассмотрим следующее (см. Комментарии): -

DROP TABLE IF EXISTS 'savegroup job';
CREATE TABLE IF NOT EXISTS 'savegroup job' (name TEXT,'start time' TEXT, 'end time' TEXT, 'completion status' TEXT);
INSERT INTO 'savegroup job' VALUES

  -- store values in DDDDDDDDDD format
    ('Name001',strftime('%s','2018-01-01 10:30'),strftime('%s','2018-01-01 12:30'),'this failed'),
    ('Name002',strftime('%s','2018-02-01 10:30'),strftime('%s','2018-02-01 12:30'),'this failed'),
    ('Name003',strftime('%s','2018-03-01 10:30'),strftime('%s','2018-03-01 12:30'),'this failed'),
    ('Name004',strftime('%s','now'),strftime('%s','now','+6 hours'),'this failed'),
    ('Name005',strftime('%s','now','+3 hours'),strftime('%s','now','+14 hours'),'this failed'),

    -- store values in "YYYY-MM-DD HH:MM:SS" format 
    ('Name006','2018-01-01 10:30','2018-01-01 12:30','this failed'),
    ('Name007','2018-01-01 10:30','2018-01-01 12:30','this failed'),
    ('Name008','2018-01-01 10:30','2018-01-01 12:30','this failed'),
    ('Name009',datetime('now'),datetime('now','+6 hours'),'this failed'),
    ('Name010',datetime('now','+3 hours'),datetime('now','+14 hours'),'this failed')
;
-- Show all data
SELECT * FROM 'savegroup job';

-- The query from the question
select name, datetime("start time","unixepoch","localtime"), datetime("end time","unixepoch","localtime"), "end time"-"start time", "completion status", "failed clients list"
from  "savegroup job"
where datetime("end time","unixepoch","localtime") >= datetime("now", "-6 hours")
and "completion status" like "%failed%";

Результаты

Все данные: -

enter image description here

Ваш запрос (он работает, если значения хранятся в правильном формате): -

enter image description here

Обработка данных как хранящихся в данный момент

Предполагается, что проблема заключается в том, что столбцы время начала и время окончания действительно хранят значения, как в формате "ГГГГ-ММ-ДД ЧЧ: ММ: СС" (строки, в которых указано имя это Name006 - Name010), тогда будет работать следующий запрос: -

-- Modified query from the question
SELECT name, 
    datetime("start time"), 
    datetime("end time"),
    strftime('%s',datetime("end time"))-strftime('%s',datetime("start time")), 
    "completion status", 
    "failed clients list"
FROM  "savegroup job"
-- where strftime('%s',"end time","unixepoch","localtime") >= strftime('%s',"now", "-6 hours") and "completion status" like "%failed%";
WHERE strftime('%s',"end time") >= strftime('%s',datetime('now','-6 hours'))
    AND "completion status" LIKE '%failed%'
;

в результате: -

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...