1

首先对这个标题感到抱歉,但我不知道如何描述它:

我将会话保存在我的表中,我想了解每小时的会话数,以了解一天中有多少会话处于活动状态。会话由两个时间戳指定:开始和结束。

希望你能帮助我。

我们开始吧: http ://sqlfiddle.com/#!2/bfb62/2/0

4

3 回答 3

1

虽然我仍然不确定您想如何比较开始日期和结束日期,但看起来像使用COUNT, YEAR, MONTH,DAYHOUR,但您可以得出您想要的结果。

可能与此类似:

SELECT COUNT(ID), YEAR(Start), HOUR(Start), DAY(Start), MONTH(Start)
FROM Sessions
GROUP BY YEAR(Start), HOUR(Start), DAY(Start), MONTH(Start)

还有SQL 小提琴

于 2013-01-12T00:47:42.003 回答
0

好的,这是索引表可以解决的另一个问题。

索引表是每个人都应该在他们的工具包中拥有的东西,最好是在主数据库中。它是一个带有单个id int primary key索引列的表,其中包含从 0 到 n 的序号,其中 n 是一个足够大的数字,可以满足您的需要,100,000 很好,1,000,000 更好。您只需要创建此表一次,但一旦创建,您会发现它具有各种应用程序。

对于您的问题,您需要每小时考虑一次,如果我理解您的问题,您需要计算在该小时结束之前开始并且在该小时开始之前尚未结束的每个会话。

这是解决方案的SQL 小提琴

它的作用是使用索引表中的已知序列号(这个小提琴只有 0 到 100 - 刚刚超过 4 天 - 你可以看到为什么你需要一个大的 n)在小时的顶部和底部与你的数据链接。

于 2013-01-12T06:32:15.477 回答
0

你想做的事情在 MySQL 中是相当困难的。但是,您可以轻松获得近似值。以下统计一天内开始和停止的用户:

select date(start), hour,
       sum(case when hours.hour between hour(start) and hours.hour then 1 else 0
           end) as GoodEstimate             
from sessions s cross join
     (select 0 as hour union all
      select 1 union all
      . . .
      select 23
     ) hours
group by date(start), hour

当用户跨越多天时,查询会更难。这是一种方法,它假设存在一个每小时开始的用户:

select thehour, count(*)
from (select distinct date(start), hour(start),
             (cast(date(start) as datetime) + interval hour(start) hour as thehour
      from sessions
     ) dh left outer join
     sessions s
     on s.start <= thehour + interval 1 hour and
        s.end >= thehour
group by thehour

注意:这些未经测试,因此可能存在语法错误。

于 2013-01-12T01:00:48.987 回答