以15分钟为间隔对mysql进行分组查询

gsi*_*ner 32 mysql sql datetime timestamp group-by

我有一个监控系统,每隔n秒收集一次数据(n大约是10但是有变化).我想以15分钟的间隔汇总收集的数据.有没有办法将时间戳值合并为15分钟块以允许分组工作?

unu*_*tbu 57

SELECT   FLOOR(UNIX_TIMESTAMP(timestamp)/(15 * 60)) AS timekey
FROM     table
GROUP BY timekey;
Run Code Online (Sandbox Code Playgroud)

  • 分钟不应该是`UNIX_TIMESTAMP(timestamp)/(15*60)`吗? (4认同)
  • 我认为使用 FLOOR 会产生比 ROUND 函数更好的结果:00:00:00 将与高达 00:14:59 的值分组。我认为这是一个更自然的概念。 (3认同)
  • 我不认为ROUND是应该在这里使用的正确功能.DIV更合适.`UNIX_TIMESTAMP(timestamp)DIV(15*60)`因为SELECT ROUND(1.8),ROUND(2.1)将属于同一段,但它们不应该.参考:http://stackoverflow.com/a/3086470/412786 (2认同)

小智 12

试试这个,15分钟间隔的记录分组,你可以改变15*60到你需要的间隔

SELECT sec_to_time(time_to_sec(datefield)- time_to_sec(datefield)%(15*60)) as intervals from tablename
group by intervals
Run Code Online (Sandbox Code Playgroud)

  • 如果记录包含多个日期,这将不起作用,因为所有日期时间相同的记录都被分组。 (3认同)

Mar*_*cka 5

以下方法 1) 的改编:

select Round(date_format(date, "%i") / (15*60)) AS interval  
from table
group by interval 
Run Code Online (Sandbox Code Playgroud)

以下方法 3) 的改编:

SELECT Round(Convert(substring(date_column, 14, 2), UNSIGNED) / (15*60)) AS interval /* e.g. 2009-01-04 12:20:00 */
FROM table 
GROUP BY interval;
Run Code Online (Sandbox Code Playgroud)

我在这里找到了一些方法:

1)

select date_format(date, "%W") AS `Day of the week`, sum(cost)
from daily_cost
group by `Day of the week` 
order by date_format(date, "%w")
Run Code Online (Sandbox Code Playgroud)

2)

select count(*) as 'count', 
  date_format(min(added_on), '%Y-%M-%d') as 'week commencing',
  date_format(added_on, '%Y%u') as 'week' 
from system 
where added_on >= '2007-05-16' 
group by week 
order by 3 desc;
Run Code Online (Sandbox Code Playgroud)

3)

SELECT substring(postdate, 1,10) AS dd, COUNT(id) FROM MyTable GROUP BY dd;
Run Code Online (Sandbox Code Playgroud)

(也在这里:http ://www.bradino.com/mysql/dayparting-on-datetime-field-using-substring/ )

编辑:所有解决方案在具有大量记录的表上都会表现不佳。