MySQL组的时间

时间:2014-09-01 05:03:22

标签: mysql timestamp divide

我正在尝试执行一个sql,它在分组时间段后检索开始时间和行数。我已经在stackoverflow上检查过了,我可以实现

GROUP BY UNIX_TIMESTAMP(time_stamp) DIV 30

问题在于我需要从一定时间开始(它可能存在或可能不存在于行之间)甚至(如果可能 - 不需要考虑)添加0计数项目的时间。

例如,有一个包含此行的表:

+---------------------+-----------------+
| time_stamp          | id              |
+---------------------+-----------------+
| 2010-06-15 23:00:04 |               1 |
| 2010-06-15 23:00:30 |               2 |
| 2010-06-15 23:01:30 |               3 |
| 2010-06-15 23:03:30 |               4 |
| 2010-06-15 23:04:30 |               5 |
| 2010-06-15 23:06:10 |               6 |
| 2010-06-15 23:06:20 |               7 |
| 2010-06-15 23:06:30 |               8 |
| 2010-06-15 23:06:30 |               9 |
| 2010-06-15 23:06:35 |              10 |
+---------------------+-----------------+

从2010-06-15 23:00:00开始每分钟(DIV 60),我想得到以下输出:

+---------------------+-----------------+
| time_stamp          | count(id)       |
+---------------------+-----------------+
| 2010-06-15 23:00:00 |               2 |
| 2010-06-15 23:01:00 |               1 |
| 2010-06-15 23:02:00 |               0 |
| 2010-06-15 23:03:00 |               1 |
| 2010-06-15 23:04:00 |               1 |
| 2010-06-15 23:05:00 |               0 |
| 2010-06-15 23:06:00 |               5 |
+---------------------+-----------------+

。即使没有count = 0的情况也会很酷。

此外..添加每个时间戳然后删除它不是一个解决方案..

这些是虚拟数据,我不想仅按分钟划分,而是通过php

中的参数划分

可以找到正确的答案here,但我只能通过标记为已接受的帖子找到答案。

1 个答案:

答案 0 :(得分:1)

你要做的就是GROUP BY,然后使用时间函数..在这种情况下,MINUTE应该做你想做的事情

SELECT COUNT(*) FROM table
GROUP BY MINUTE(time_stamp)

修改

在编辑问题之后我相信这个查询将更接近您想要做的事情。

SELECT 
  FROM_UNIXTIME
  (   FLOOR(UNIX_TIMESTAMP(`time_stamp`)/your_var
           )* your_var
  ) AS timesliced, 
  COUNT(*) AS mycount
FROM tablename
WHERE time_stamp >= '2010-06-15 23:01:45' 
GROUP BY timesliced