根据两个日期时间条目计算每小时活跃用户数

时间:2016-03-21 03:29:05

标签: php mysql sql datetime

我有一个MySQL查询问题。

在我的网络应用程序中,我在我的Shoutcast服务器上记录MySQL数据库表中的活动监听器,其中包括“已创建”,他们调入时的日期时间字段,以及最新时间的“更新”,日期时间字段服务器轮询Shoutcast服务器(每分钟)。另外,我还会检索听取会话的持续时间(以秒为单位),以及每个会话唯一的uid(也称为会话ID)。

我想做的是计算每小时的听众数量,例如13:00 = 20个听众,但我想不仅包括那些被调入的人,所以“创建”日期时间字段,还要任何仍在前一小时收听的听众,所以“更新”日期时间字段。

我需要什么查询才能实现此目的。我一次只会产生1天的结果。

我理解它会如何使用类似于“COUNT(id)AS hits”和“GROUP BY”的内容,但我不确定如何考虑日期时间字段,因为“更新”日期时间字段会不断更新,只要用户仍在听。有些用户可以继续听3小时+。

修改

数据库模式的主要部分是:id(int 20),created(datetime),updated(datetime),uid(int 20),duration(int 10)。

期望的结果看起来类似于:

(时间/命中)0900 => 10,1000 => 15,1100 => 5,1200 => 8,1300 => 25

依旧......

这是我用来按国家/地区筛选结果的查询,它使用group by和count(): -

SELECT country,COUNT(id)AS hits FROM listeners_log WHERE YEAR(created)= YEAR(NOW())AND MONTH(created)= MONTH(NOW())AND duration> = 60

该查询还在末尾添加了一个过滤器,用于过滤掉长度小于60秒的会话。

再详细说明一下,创建的字段反映了用户连接/启动监听会话的时间。例如,他们在2016-03-21 15:00:00收听,这反映在创建的字段中。但如果他们仍在1小时内收听,则更新字段将显示为2016-03-21 16:00:00,但创建的字段将保持不变。

更新

我已经提出了以下SQL,但这只计算了由创建的字段指示的初始连接,并忽略了一个用户从一小时到下一小时是否保持连接。

SELECT HOUR(已创建),COUNT(id)AS命中FROM listeners_log WHERE DATE(已创建)= CURDATE()group by HOUR(已创建)

1 个答案:

答案 0 :(得分:0)

因此,您只需要查询“更新”日期时间字段,因为即使新用户访问其条目也会使用“已创建”日期时间以及“更新”日期时间内的下次更新创建,所以现在您关注将仅查询任何特定小时的“更新”日期时间。

SELECT COUNT(id) FROM TABLE_NAME
WHERE update_Field BETWEEN DATE(NOW() - INTERVAL 1 HOUR);

这是一个示例查询来帮助您,我现在没有架构来测试它。 以你的方式修改它 如果它不起作用,请告诉我。