Depende do tamanho do seu intervalo de datas. Se todas as datas estiverem dentro de um mês, por exemplo, você pode fazer isso:
select day(timestamp) as Day, hour(timestamp) as Hour, count(*) as Count
from MyTable
where timestamp between :date1 and :date2
group by day(timestamp), hour(timestamp)
Você também pode agrupar por ano e mês se precisar separar ainda mais seus dados.