2013-05-01 5 views
4

В моем проекте мне нужно рассчитать временной интервал. В настоящее время я извлекаю каждый TimeStamp, который соответствует моему запросу и хранит их в List<>. Затем я перебираю список, чтобы увидеть, есть ли интервалы в 10 секунд или меньше, а затем я добавляю их вместе. Все, что превышает 10 секунд, игнорируется. Мне интересно, есть ли SQL-запрос, который я могу сделать, который сделает это для меня? Я сделал несколько поисков, но ничего не нашел. По сути, я бы не хотел хранить столько информации в памяти, если мне это не нужно. Вот метод я использую для перебора моих List<>:SQL-запрос для расчета временных интервалов на основе временных меток

private static TimeSpan TimeCalculations(IList<DateTime> timeStamps) 
{ 
    var interval = new TimeSpan(0, 0, 10); 
    var totalTime = new TimeSpan(); 

    for (var j = 0; j < timeStamps.Count - 1; j++) 
    { 
     if (timeStamps[j + 1].Subtract(timeStamps[j]) > interval) continue; 
     var timeDifference = timeStamps[j + 1].Subtract(timeStamps[j]); 
     totalTime = totalTime.Add(timeDifference); 
    } 

    return totalTime; 
} 

Данные, которые извлекаются в настоящее время может быть от 10 до 400k строк на сумму данных. Вот пример:

2006-09-07 11:46:09 
2006-09-07 11:46:19 - 10 seconds 
2006-09-07 11:46:20 - 1 second 
2006-09-07 11:46:36 

2006-09-07 11:47:49 
2006-09-07 11:47:53 - 4 seconds 
2006-09-07 11:48:02 - 9 seconds 
2006-09-07 11:48:15 
2006-09-07 11:48:29 
2006-09-07 11:48:34 - 5 seconds 

2006-09-07 11:54:29 
2006-09-07 11:54:39 - 10 seconds 
2006-09-07 11:54:49 - 10 seconds 
2006-09-07 11:54:59 - 10 seconds 

Это приведет к примерно 59 секундам. Это тот результат, который я ищу.

База данных, которую я использую, является SQLite.

EDIT

Глядя на ответы, я могу сказать, что мой вопрос был не совсем достаточно тщательно. Мой текущий запрос на получение TimeStamps достаточен. Я ищу запрос, чтобы добавить разницу между ними, если интервал составляет 10 секунд или меньше.

+0

Можете ли вы дать нам более подробную информацию о данных, с которыми вы хотите работать в базе данных? Структура таблицы, данные образца, желаемый результат из этих данных образца будет хорошим началом ... –

+0

hmmm Вы можете использовать библиотеку linq? – Nomad101

+0

@ Nomad101 Да, могу. – MyCodeSucks

ответ

3

Используется данные выборки для создания sqlfiddle и этот запрос работает против ваших данных выборки:

SELECT DISTINCT tbl.timestamp FROM main_tbl tbl 
INNER JOIN 
(
SELECT temp.ID, temp.timestamp FROM main_tbl temp 
)test 
ON tbl.timestamp <= datetime(test.timestamp, '+10 seconds') 
AND tbl.timestamp >= datetime(test.timestamp, '-10 seconds') 
AND tbl.ID <> test.ID 
ORDER BY tbl.timestamp 

http://sqlfiddle.com/#!7/049f5/3

EDIT 2:

SELECT 
sum(
    strftime('%s', 
    (
    SELECT min(temp.timestamp) 
     FROM main_tbl temp 
     WHERE temp.timestamp > tbl.timestamp 
    ) 
) - strftime('%s',tbl.timestamp) 
) as total_sum 
FROM main_tbl tbl 
WHERE (
    strftime('%s', 
    (
     SELECT min(temp.timestamp) 
     FROM main_tbl temp 
     WHERE temp.timestamp > tbl.timestamp 
    ) 
) - strftime('%s',tbl.timestamp) 
) <= 10 
AND date = "2013-05-13" 
AND col1 = col2 

http://sqlfiddle.com/#!7/049f5/55

+0

Будет ли это добавление различий вместе? – MyCodeSucks

+0

Я действительно копаю второе редактирование. Мой единственный вопрос сейчас, где я бы добавил дополнительные требования к запросу? Сейчас мой запрос: SELECT timestamp FROM table WHERE date = "2013-05-13" AND col1 = col2; '. – MyCodeSucks

+0

Вы добавляете это после части '<= 10'. – SOfanatic

3

я играл с простой таблицей с int col s t1 и t2 и получил правильные результаты по этому запросу, я думаю. При необходимости адаптируйте предпоследнюю линию!

SELECT sum(diff) FROM ( 
SELECT t_1.rowid AS this_id, other_t1 - t_1.t1 as diff 
FROM temp AS t_1 
JOIN 
(SELECT t_2.t1 AS other_t1, t_2.rowid AS other_id 
    FROM temp t_2 ) 
ON this_id = other_id-1 
WHERE other_t1 - t_1.t1 = 1 
); 

Это тройной вложенный выбор. Внешняя суммирует все найденные различия. и это только первая и последняя строки. Второй уровень - со второй строки - делает большую часть работы. Внутренний выбор предоставляет список строк таблицы и значений временной отметки для второго уровня для воспроизведения.

Действие заключается в суммировании различий во всех строках, имеющих «t1», который отличается на 1 от следующей более высокой строки.

Чтобы увидеть сами различия, опустите первую и последнюю строки и замените ";"

... забыли сказать. t1 должен был быть отметкой времени. t2 представлял «другие данные».

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