Если не нужны праздники, высокосные секунды и вот это вот все, То я бы делал так:
1) Сначала привести времена начала и конца к одному и тому же времени суток.
Отмотайте время конца до полночи назад - прибавьте пересечение отрезка [0, end_time] c [7:00, 22:45] к ответу (если дата конца рабочая). Также отмотайте время начала вперед до полночи, также учитывая работчее время (если дата начала рабочая.
При этом к дате начала прибавьте 1, а от даты конца 1 вычтите. Отдельно рассомтрите случай, если даты начала и конца одинаковые.
Тут нужно будет по дате уметь определять рабочая ли она (получать день недели стандартной функцией).
2) Теперь осталось подсчитать, сколько рабочих дней между двумя датами (включая их). Я бы тупо вычел времена полдней этих дат друг из друга и поделил на 60*60*24 секунд, чтобы узнать сколько суток прошло. Теперь еще надо определить дни недели начала и конца.
Далее, также как с временем, отматываем дату начала до следующего понедельника, а дату начала до предыдущего воскресенья. Прибавляем к ответу (рабочее время в сутках)*(max(6-номер_дня_недели_начала, 0)+min(номер_дня_недели_конца, 5)). Теперь считаем сколько осталось полных недель (вычитаем сдвинутые даты друг из друга в днях и делим на 7) и прибавляем столько полных рабочих недель. Особый случай, если начало и конец в одной неделе (разница между ними <= 7-номер_дня_недели_начала).