簡體   English   中英

SQL查詢基於時間戳計算時間跨度

[英]SQL query to calculate time spans based upon time stamps

在我的項目中,我需要計算時間跨度。 當前,我正在檢索與查詢匹配的每個時間戳,並將它們存儲在List<> 然后,我遍歷列表以查看是否有10秒或更短的時間間隔,然后將它們加在一起。 大於10秒的時間將被忽略。 我想知道是否存在可以執行的SQL查詢,對我來說可以嗎? 我已經做了一些搜索,但是什么也沒找到。 本質上,如果不需要,我不想在內存中存儲太多信息。 這是我用來遍歷List<>

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到40萬行的數據。 這是一個示例:

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。

編輯

查看答案,我可以說我的問題還不夠徹底。 我當前獲取時間戳的查詢就足夠了。 我要尋找的是一個查詢,如果間隔為10秒或更短,則將它們之間的差異相加。

使用您的樣本數據創建了一個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

我認為我玩了一個具有int col 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代表“其他數據”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM