Observa esto sacado de:
http://forums.mysql.com/read.php?10,...807#msg-202807
GROUP BY ((60/periodMinutes) * HOUR( thistime ) + FLOOR( MINUTE( thistime ) / periodMinutes ))
where thistime is the TIME column and periodMinutes is the period length in minutes
Donde pone periodMinutes, pones 30; y donde thistime, pones el nombre de tu campo de tipo TIME. La lógica parece sencilla: divides (siempre que se trata de números que sean divisores de 60) 60 por el número de minutos del período, y el resultado lo multiplicas por el número de horas, y a eso le sumas el número entero más elevado de los minutos divididos por el período: por ej. 02:35:00 agruparía por 2*2+1 = 5, agruparía por 5.
Para agrupar por cuarto de hora, aconseja esto (So to group by 15-min periods, write ...):
SELECT ...
GROUP BY ( 4 * HOUR( thistime ) + FLOOR( MINUTE( thistime ) / 15 ))