用于根据时间戳计算时间跨度的 SQL 查询

Posted

技术标签:

【中文标题】用于根据时间戳计算时间跨度的 SQL 查询【英文标题】:SQL query to calculate time spans based upon time stamps 【发布时间】:2013-04-25 23:29:32 【问题描述】:

在我的项目中,我需要计算时间跨度。目前,我正在检索与我的查询匹配的每个时间戳并将它们存储在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 到 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。

编辑

查看答案,我可以看出我的问题不够彻底。我当前获取时间戳的查询就足够了。我正在寻找的是一个查询,如果间隔为 10 秒或更短,则将它们之间的差异加在一起。

【问题讨论】:

您能否详细介绍一下您希望在数据库中使用的数据?表结构、样本数据、该样本数据的预期结果将是一个好的开始...... hmmm 你能使用 linq 库吗? @Nomad101 是的,我可以。 您使用的是哪个 RDBMS? 您是否要查询下一个连续行的标记间隔小于 10 秒的行? 【参考方案1】:

使用您的示例数据创建了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

【讨论】:

这是否也会将差异加在一起? 我真的在挖掘第二个编辑。我现在唯一的问题是,我会将查询的附加要求放在哪里?现在我的查询是SELECT timestamp FROM table WHERE date = "2013-05-13" AND col1 = col2; 您在&lt;= 10 部分之后添加。【参考方案2】:

我认为,我使用了一个带有 int cols 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”的所有行的差异求和,该“t1”与下一个较高行相差 1。

要查看差异本身,请省略第一行和最后一行并替换“;”

...忘了说。 t1 应该是时间戳。 t2 代表“其他数据”。

【讨论】:

以上是关于用于根据时间戳计算时间跨度的 SQL 查询的主要内容,如果未能解决你的问题,请参考以下文章

根据大致时间跨度计算大致日期

SQL - 显示给定范围内的所有日期,并使用数据库中的时间戳计算该日期有多少帖子

Kohana ORM:如何查询基于数据库中的字段计算的时间戳

如何根据当前时间戳计算每天0点0分0秒的unix时间戳?

Hive SQL计算5天前的时间戳

ms-sql 如何查询开始时间与结束时间之间的数据?