select count(*) as work_day_count --считаем, что осталось после отсечения выходных и праздников
from (SELECT distinct t1.*, t1.c1 + INTERVAL iterator.day DAY as dt_day
FROM (select STR_TO_DATE("01.10.2018", "%d.%m.%Y") c1, STR_TO_DATE("22.10.2018", "%d.%m.%Y") c2 union all
select STR_TO_DATE("22.10.2018", "%d.%m.%Y") c1, STR_TO_DATE("10.11.2018", "%d.%m.%Y") c2 ) t1 --таблица с проверяемыми интервалами
join (select @start_day := @start_day + 1 as day
from news, -- любая произвольная таблица с числом строк, больше чем ширина максимально возможного интервала дней, который можно рассмотреть этим запросом
(select @start_day := -1) init_day --инициализация переменной start_day
) iterator --итератор дней, ведет отсчет с 0 и до куда надо (до максимального интервала, который может быть)
on (t1.c1 + INTERVAL iterator.day DAY) <= t1.c2 --верхнее ограничение итератора
and (t1.c1 + INTERVAL iterator.day DAY) not in -- отсекаем выходные и праздники
(select STR_TO_DATE("06.10.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("07.10.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("13.10.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("14.10.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("20.10.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("21.10.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("27.10.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("28.10.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("03.10.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("04.11.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("10.11.2018", "%d.%m.%Y") c1 union all
select STR_TO_DATE("11.11.2018", "%d.%m.%Y") c1) -- тут делаем выборку выходных дней и праздников
order by dt_day ) a