-1

我有下表

表:项目
字段:id | 时间戳 | 地位

id 只是 auto inc 键
时间戳是 m:d:yh: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 查询来完成

4

3 回答 3

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 |
+-------------+---------------------+---------------------+

不保证性能。这必然会进行表扫描。

于 2013-06-07T18:02:57.713 回答
0

只是一个提示。

我会尝试表达随着时间的流逝而流逝的时间:)。

所以我会从类似的东西开始:DATEDIFF(hour, timestamp, start_timestamp) / 3.

表达式应为下一个时间段返回从 0 开始的自然数。

然后你可以GROUP BY表达上面和COUNT()状态。

我手头没有 MySQL 来测试它,但我确信有一些功能可以帮助你。

祝你好运!

于 2013-06-07T17:46:32.793 回答
0

您可以获取您的日期CURRENT_TIMESTAMP,然后通过DATEDIFF()传递它们

DATEDIFF(hh, @date1, @date2)

将返回小时差

在您将在 SQL 查询之前声明的SQL 函数中。

只需稍等片刻,您就有足够的时间来覆盖这一天,按 date_difference 分组并使用COUNT()函数来计算状态。

于 2013-06-07T17:48:42.840 回答