você pode resolver isso criando uma tabela que conterá 24 valores para horas (00:00, 01:00 etc) e realizar uma junção esquerda (ou direita) com ela e sua tabela permitindo nulos para que você tenha todas as 24 linhas mesmo se sua tabela contém 0 linhas, então agrupar por deve funcionar bem.
Não se esqueça de truncar tudo, exceto a hora da sua mesa, quando você executar o join, então o resultado da função você chama e executa
join on
pode ser igual ao valor desta tabela de ajuda. você pode usar a seguinte consulta para fazer o trabalho depois de preencher a tabela testtime com 24 valores test_time
select test_time,sum(sign(coalesce(idFromYourTable,0))) as count from testtime
left join yourTable on test_time=hour(yourTableTime)
group by test_time
Isso fornecerá 0 como contagem se não houver valores correspondentes à linha da tabela de teste, enquanto count(*) fornecerá 24 linhas com 1s em vez de 0s, mesmo que sua tabela esteja vazia, também se houver apenas 1 linha em sua tabela é impossível distinguir a diferença entre 0 linhas porque os resultados terão a mesma aparência para as 2 linhas seguintes
cause ambos fornecerão a mesma contagem de linhas de resultado igual a 1 , enquanto a técnica de soma trata essas linhas de maneira diferente