2013-05-01 141 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。

编辑

望着答案,我可以告诉大家,我的问题是不是很透彻不够。我目前的查询来获取TimeStamps就足够了。我正在寻找的是一个查询,如果间隔为10秒或更短,它们之间的差异将加在一起。

+0

您能否介绍一下您想在数据库中使用的数据的更多细节?表结构,样本数据,来自该样本数据的预期结果将是一个好的开始...... – 2013-05-01 21:53:58

+0

嗯,你能够使用linq库吗? – Nomad101 2013-05-01 21:54:05

+0

@ Nomad101是的,我可以。 – MyCodeSucks 2013-05-01 21:59:00

回答

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

编辑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 2013-05-02 13:27:59

+0

我真的在挖第二个编辑。我现在唯一的问题是,我会在哪里提出查询的额外要求?现在我的查询是'SELECT timestamp FROM table WHERE date =“2013-05-13”AND col1 = col2;'。 – MyCodeSucks 2013-05-02 16:04:58

+0

在'<= 10'部分之后加上。 – SOfanatic 2013-05-02 19:25:49

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代表“其他数据”。