Para lidar com datas com 0 registros correspondentes, minha prática normal é usar uma tabela de calendário para unir.
Por exemplo, crie uma tabela com um campo chamado
calendar_date
e preenchê-lo com todas as datas de 1st Jan 2000
até 31st Dec 2070
, ou algum outro intervalo adequado aos seus propósitos de relatório. Então use algo como...
SELECT
calendar.calendar_date,
COUNT(*)
FROM
calendar
LEFT JOIN
yourData
ON yourData.timeStamp >= calendar.calendar_date
AND yourData.timeStamp < calendar.calendar_date + 1
WHERE
calendar.calendar_date >= '01 Jan 2012'
AND calendar.calendar_date < '04 Jan 2012'
GROUP BY
calendar.calendar_date
Esta tabela pode ter muitos usos extras, como sinalizar feriados, início de semanas e meses. Com usos prudentes de sinalizadores e índices, você pode obter muito disso.