按unix时间戳+ 24小时分组

时间:2016-10-31 23:00:33

标签: php mysql sql

我正在编写一个报告程序,它使用MySQL作为数据库,php作为脚本语言。

我想要做的是按时间对记录进行分组,并在结果集中过去24小时内将它们分组。

当前查询

SELECT count(*),time FROM `service_data` GROUP BY time

上面的查询在过去24小时内没有对它们进行分组,它只是将类似的unixtimestamp组合在一起

表格结构

CREATE TABLE IF NOT EXISTS `service_data` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `service_id` varchar(255) NOT NULL,
  `ip_address` varchar(255) NOT NULL,
  `time` int(11) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=5 ;

在结果集中,如果特定小时内没有报告,我希望24条记录为空。

喜欢这样

| hour |  reports |
|------|----------|
|   1  |    5     |
|   2  |    10    |
|   3  |    12    |
|   4  |    25    |

非常感谢任何帮助!

谢谢!

1 个答案:

答案 0 :(得分:1)

要获得最近24小时,请将1天前的时间转换为unix时间戳:

UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))

要将时间戳转换回小时,请先将其转换为时间,然后使用HOUR函数:

HOUR(FROM_UNIXTIME(time))

结合这些,您可以:

SELECT HOUR(FROM_UNIXTIME(time)) AS hour, COUNT(*)
FROM service_data
WHERE time >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))
GROUP BY hour

如果表格非常大,请在time列上添加索引,这样就不必进行完整扫描。

要获得没有数据的小时数的结果,您需要使用包含所有小时数的表格LEFT JOIN

SELECT t1.hour, COUNT(s.id) AS reports
FROM (SELECT 0 AS hour UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 ... UNION SELECT 23) AS t1
LEFT JOIN service_data AS s
ON t1.hour = HOUR(FROM_UNIXTIME(s.time)) AND s.time >= UNIX_TIMESTAMP(DATE_SUB(NOW(), INTERVAL 1 DAY))
GROUP BY t1.hour
ORDER BY t1.hour