Alla fine ho risolto in questo modo, utilizzando UNIX_TIMESTAMP:
codice:
"select Operatore, sum(conta) as tot, ora as turno from (SELECT operatore1 as Operatore, count(operatore1) as conta,(FROM_UNIXTIME(ora_ric,'%H')) as ora from t1op_trasporti where ora_ric>=$data1 and ora_ric<=$data2 and operatore1>0 and osp='$osp' group by (FROM_UNIXTIME(ora_ric,'%H')), operatore1 union all SELECT operatore2 as Operatore, count(operatore2) as conta,(FROM_UNIXTIME(ora_ser2,'%H')) as ora from t1op_trasporti where ora_ser2>=$data1 and ora_ser2<=$data2 and operatore2>0 and osp='$osp' group by (FROM_UNIXTIME(ora_ser2,'%H')), operatore2 union all SELECT operatore3 as Operatore, count(operatore3) as conta,(FROM_UNIXTIME(ora_ric,'%H')) as ora from t1op_trasporti where ora_ric>=$data1 and ora_ric<=$data2 and operatore3>0 and osp='$osp' and operatore3>0 group by (FROM_UNIXTIME(ora_ric,'%H')), operatore3 union all SELECT operatore4 as Operatore, count(operatore4) as conta,(FROM_UNIXTIME(ora_ser2,'%H')) as ora from t1op_trasporti where ora_ser2>=$data1 and ora_ser2<=$data2 and operatore4>0 and osp='$osp' and operatore4>0 group by (FROM_UNIXTIME(ora_ser2,'%H')), operatore4 ) as t1 group by turno,Operatore order by turno"
Questo mi restituisce una riga per ogni orario ogni volta che si verifica un cambio di Operatore.
Ora però se volessi raggruppare ancora i risultati che hanno come turno un valore compreso fra 0 e 6 e fra 21 e 23 come posso fare? Ho pensato un having ma mi cancellerebbe le altre soluzioni