Может быть, вывести вот это:
o.datetime_order >= $date_start
AND o.datetime_order <= $date_end
из-под join'а в where?
Например, так:
SELECT w.name_worker,
w.surname_worker,
w.midname_worker,
w.id_worker,
SUM(number) numb
FROM workers w
LEFT JOIN exhours e ON (w.id_worker = e.id_worker)
LEFT JOIN orders o ON (e.id_order = o.id_order)
where
o.datetime_order >= $date_start
AND o.datetime_order <= $date_end
GROUP BY w.id_worker
Потому что сейчас получается так:
1. Будут выведены все записи таблицы Workers
2. К ним будут прицеплены _все_ записи таблицы exhours по полю id_worker
3. Также будут прицеплены записи таблицы orders, _для которых поле datetime_order попадает в указаную вилку_
Однако, поле number-то хранится в таблице exhours!
Как вариант, можно было бы сделать так:
SELECT w.name_worker,
w.surname_worker,
w.midname_worker,
w.id_worker,
SUM(h.number) numb
FROM
workers w
left join
(select e.id_worker, e.number from
exhours e inner join orders o on e.id_order = o.id_order
where o.datetime_order >= $date_start
AND o.datetime_order <= $date_end) h
on w.id_worker = h.id_worker
GROUP BY w.id_worker