Иметь таблицу, в которой есть строка для каждой интересующей вас даты, и, скажем, столбец «рабочих часов» или просто индикатор «рабочего дня», если вы хотите сделать это с дневной детализацией.(Я считаю, что этот подход делает финальный SQL проще, плюс включает все виды других полезных запросов, но затем я обращаюсь к хранилищу данных, а не к рабочим базам данных, поэтому вы можете найти подход «просто перечислить праздники» лучше, в зависимости..)
Вам, конечно, придется создавать эту таблицу самостоятельно, исходя из некоторого количества дат выходных для интересующего вас региона.
Обычно вы можете проецировать их впередпо крайней мере, на год, так как большинство государственных праздников заранее согласованы (хотя некоторые из них появляются в «последнюю минуту» - например, в Великобритании 29 апреля будет дополнительным государственным праздником в 2010 году,поскольку происходит королевская свадьба, и мы получили уведомление об этом менее чем за год.
Тогда вы просто
SELECT
SUM(working_hours)
FROM
all_dates
WHERE
the_date BETWEEN @start_date AND @end_date
Если вы хотите сделать это на международном уровне, это невероятно труднополучить ваши данные, нет никакого разумного источника, который я знаю о датах международных праздников, и разные регионы в "стране" могут отличатьсяв настоящее время - например, вы можете знать, что кто-то находится в Соединенном Королевстве, но если вы не знаете, находятся ли они в Шотландии или нет, вы не будете знать, являются ли первые два дня года государственным праздником или только первым...