Я бы попробовал что-то похожее на решение, которое я дал в вопросе Выберите все месяцы в пределах данного диапазона дат, включая месяцы с 0 значениями , которые включали дополнительную таблицу со всеми датами в заданном периоде.Я думаю, что мой перешел с 1970 на 2100 или аналогичный:)
По сути, вы создаете эту таблицу и добавляете пару дополнительных столбцов с именами ddFirstWorkDay и ddLastWorkDay как битовое поле, которое вы вручную заполняете с помощью '1'для первого и последнего рабочих дней каждого месяца в таблице - только двенадцать из них в год, поэтому не должно занимать слишком много времени.Вы также можете принять во внимание праздники и другие особые случаи, используя этот метод, поскольку данные вводятся вручную, а не рассчитываются.
Затем вы можете создать запрос в соответствии с приведенными ниже строками, чтобы получить даты, которые выинтересует.
SELECT ddDate from dimDates
WHERE ddDate BETWEEN 'start date' AND 'end date'
AND ddFirstWorkDay = 1
ORDER BY ddDate
LIMIT 1
SELECT ddDate from dimDates
WHERE ddDate BETWEEN 'start date' AND 'end date'
AND ddLastWorkDay = 1
ORDER BY ddDate DESC
LIMIT 1
Я думаю, что это даст вам то, что вам нужно, хотя вам нужно будет выполнить два запроса для каждого тестируемого диапазона дат, таблица небольшая, поэтому должна возвращаться очень быстро.
Вам может показаться, что метод таблицы dimDates интересен и для других целей, поэтому я бы посмотрел ..:)