我正在尝试每30分钟对时间戳分组一次。

我希望我的结果是这样的:

2016-03-09 00:00:00
2016-03-09 00:30:00
2016-03-09 01:00:00

相反,我的结果是这样的:
2016-03-09 00:00:23
2016-03-09 00:35:02
2016-03-09 01:00:03

我正在使用的查询是这样
SELECT timestamp
FROM a.tablename
WHERE name = 'example' AND timestamp LIKE '2016-03-09%'
GROUP BY ROUND(((60/30) * HOUR(timestamp) + FLOOR( MINUTE(timestamp) / 30)));

我怎样才能得到理想的结果?我研究了SO的其他答案,但没有一个答案有帮助

最佳答案

这是按30分钟间隔进行分组的基本查询。

SELECT
FROM_UNIXTIME(ROUND(UNIX_TIMESTAMP(timestamp)/(30* 60)) * (30*60)) thirtyHourInterval
FROM tablename
GROUP BY ROUND(UNIX_TIMESTAMP(timestamp)/(30* 60));

注意: ROUND()可能会导致您输出错误。请改用以下查询。看下面的例子:
SELECT ROUND(3.7), ROUND(4.2);

结果: 4 4

两者位于同一段中。以上查询的结果相同,但四舍五入不同段的timestamp可能落在同一段中,从而导致错误的输出

[推荐以下查询]
SELECT
FROM_UNIXTIME((UNIX_TIMESTAMP(`timestamp`) DIV (30* 60) ) * (30*60)) thirtyHourInterval
FROM tablename
GROUP BY UNIX_TIMESTAMP(`timestamp`) DIV (30* 60)

SQL FIDDLE DEMO

或者,您可以采用以下查询。
SELECT
FROM_UNIXTIME(ROUND(UNIX_TIMESTAMP(timestamp)/(30* 60)) * (30*60)) thirtyHourInterval
FROM tablename
GROUP BY ( 4 * HOUR( `timestamp` ) + FLOOR( MINUTE( `timestamp` ) / 30 ));

Relatedpost

关于mysql - 每30分钟分组一次时间戳,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36169037/

10-13 01:24