分组时间范围的sqlite查询

Posted

技术标签:

【中文标题】分组时间范围的sqlite查询【英文标题】:sqlite query for grouped time-frame 【发布时间】:2012-03-24 09:55:12 【问题描述】:

我正在尝试将我的连接历史记录表查询为每小时时间范围,每小时是连接持续时间。

create table sessionHistory (
  _id       integer PRIMARY KEY autoincrement,
  modified  integer,
  ip        text,
  ...
  started   integer,
  ended     integer
);

每个连接开始都有一个“开始”日期,当它完成时,我会在 unix epoch 中输入一个“结束”日期。

我可以使用以下查询对它们进行分组:

select strftime('%H', started, 'unixepoch') HOUR_, 
       sum(ended-started) TOTAL_TIME_ 
from sessionHistory 
where ip='123.123.123.123' and ended!=0
group by strftime('%H', started, 'unixepoch')

现在,我还希望在每小时中包含仍在进行中的会话时间(结束=0)。

例如,在第 1 小时,连接开始并结束,持续时间为 35 秒。在第 2 小时,连接在进入第 3 小时之前开始,距离转弯还有 10 秒,在进入第 3 小时后 10 秒停止。

这意味着查询需要返回类似于小时 1 => 35、小时 2 => 10、小时 3 => 10 的内容。 此外,如果连接仍然正常(结束 = 0),我希望当前小时保存“现在”开始的数据,这将在相对小时内累积。

加入 2 个 sqlite 查询不会回答最后一个规范,因为它总是返回“now”-“started”,即使会话超过 1 小时。

【问题讨论】:

【参考方案1】:
select strftime('%H', started, 'unixepoch') HOUR_, 
       sum(ended-started)+
             (
             SELECT sum(now-started)
             from sessionHistory 
             where ip='123.123.123.123' and ended=0
             group by strftime('%H', started, 'unixepoch')
             ) TOTAL_TIME_ 
from sessionHistory 
where ip='123.123.123.123' and ended!=0
group by strftime('%H', started, 'unixepoch')

【讨论】:

以上是关于分组时间范围的sqlite查询的主要内容,如果未能解决你的问题,请参考以下文章

SQLite 按选定日期范围内的所有日期分组,即使数据不存在

如何在 Sqlite 中使用时间序列,以及快速的时间范围查询?

SQLite 和范围查询

根据时间范围对用户活动进行分组的 SQL 查询

SQLite 查询相关范围内的日期

SQL查询按范围分组