我有下表
表:项目
字段:id |时间戳|状态
id只是auto inc key
时间戳是m:d:y h:m:s
状态只有1或2个
我要生成如下报告:
Time Passed | Count of status = 1 | Count of status = 2
0-3hrs | 2 | 9
3-6hrs | 1 | 5
6-9hrs | 8 | 14
0-12hrs | 0 | 99
等等
总而言之,该报告将每个状态(1或2)分为3小时块的总和
我正在做的事情很容易用php来操作数据,但我想知道是否可以用mysql查询来完成
答案 0 :(得分:2)
SELECT
CONCAT(
FLOOR(EXTRACT(HOUR FROM timestamp) / 3)*3, '-',
FLOOR(EXTRACT(HOUR FROM timestamp) / 3)*3+3, 'hrs'
) AS `Time Passed`,
SUM(status=1) AS `Count of status = 1`,
SUM(status=2) AS `Count of status = 2`
FROM MyTable
GROUP BY `Time Passed`;
在MySQL 5.5.31上测试过。这是输出:
+-------------+---------------------+---------------------+
| Time Passed | Count of status = 1 | Count of status = 2 |
+-------------+---------------------+---------------------+
| 0-3hrs | 2 | 9 |
| 3-6hrs | 1 | 5 |
| 6-9hrs | 8 | 14 |
| 9-12hrs | 0 | 99 |
+-------------+---------------------+---------------------+
无法保证性能。这必然会进行表扫描。
答案 1 :(得分:0)
只是一个提示。
我会尝试表达时间过去时间:)。
所以我会从:DATEDIFF(hour, timestamp, start_timestamp) / 3
开始。
表达式应该在每个下一段时间内从0开始返回自然数。
然后,您可以GROUP BY
表达上方和COUNT()
状态。
我手边没有MySQL来测试,但我确信有一些功能可以帮到你。
祝你好运!答案 2 :(得分:0)
您可以截取日期CURRENT_TIMESTAMP
,然后通过DATEDIFF()
DATEDIFF(hh, @date1, @date2)
将以小时为单位返回差异
在SQL查询之前声明的SQL function中。
只需一段时间,您就可以用足够的时间来覆盖当天,按日期差异分组并使用COUNT()功能来计算状态。