查询以选择时间

时间:2017-11-22 06:32:20

标签: mysql

我正在构建使用情况报告并尝试使用以下查询按一小时时间段计算用户数

SELECT 
    COUNT(action_id) AS total, 
    HOUR(FROM_UNIXTIME(start)) AS start,
    HOUR(FROM_UNIXTIME(end)) AS end
FROM `report_action`
GROUP BY
    HOUR(FROM_UNIXTIME(start)),
    HOUR(FROM_UNIXTIME(end))

其中action_id是主键,startend是unix时间戳。

我从这个查询得到的几乎是我需要的,但是有些结果应该与其他人合并以获得正确的报告。例如,start = 1和end = 1应该与start = 1和end = 2合并,因为两者都在相同的1小时时间范围内。另一个问题是当使用时间超过一小时(start = 1和end = 3)时,这应该为start = 1添加+1计数。结束= 2并且开始= 2 |结束= 3.

这就是我想要的

count | start | end

   13 |     0 | 1
    4 |     1 | 2
  321 |     2 | 3
   23 |     3 | 4
...

作为最后的手段,我正在处理php中的当前输出以获得正确的计数,但我想知道这是否可以在纯mysql查询中实现。

1 个答案:

答案 0 :(得分:0)

不完全明白您要尝试做什么,但我只是尝试创建只有一个日期字段的表X

mysql> select * from x;
+---------------------+
| date                |
+---------------------+
| 2017-11-22 09:40:24 |
| 2017-11-22 09:40:26 |
| .....               |
| 2017-11-22 11:41:56 |
| 2017-11-22 11:41:56 |
+---------------------+

如果我想按小时分组,我只需运行以下查询:

SELECT COUNT(date) AS total, MIN(date) AS start, MAX(date) AS end FROM `x` GROUP BY HOUR(date);

如果我需要按照您的建议显示,我会使用DATE_FORMAT

SELECT COUNT(date) AS total, DATE_FORMAT(MIN(date), '%H') AS start, DATE_FORMAT(MAX(date)+10000, '%H') AS end FROM `x` GROUP BY HOUR(date);

+10000用于获取下一个小时并且可能不准确,需要对此进行更详细的调查,但我想这个主要想法已经解释了

相关问题