Я понимаю, что у вас уже есть ответ, но за то, что оно того стоит, с этим мы постоянно сталкиваемся и имеем то, что оказалось очень хорошим решением.
По сути, мы поддерживаемотдельная таблица, называемая «рабочими днями», в которой есть все мыслимые даты, которые мы когда-либо сравнивали (и это определение, конечно, будет варьироваться от приложения к приложению - но в любом случае оно никогда не будет «огромным» по стандартам RDBMS).Существует логический флаг, который указывает, является ли дата рабочим днем или выходным / праздничным днем, но, что более важно, существует значение индекса, которое увеличивается только в рабочие дни.Таблица выглядит следующим образом:

Преимуществом этого является прозрачность и масштабируемость.Если вы хотите, чтобы разница между двумя датами в рабочих днях:
select
h.entry_date, h.invoice_date, wd2.workday_index - wd1.workday_index as delta
from
sales_order_data h
join util.work_days wd1 on h.sales_order_entry_dte = wd1.cal_date
join util.work_days wd2 on h.invoice_dte = wd2.cal_date
Если вам нужно взять дату в таблице и добавить 20 дней (как в исходной постановке задачи):
select
h.date_field_1, wd2.cal_date as date_field_1_plus_20
from
my_table h
join util.work_days wd1 on h.date_field_1 = wd1.cal_date
join util.work_days wd2 on
wd1.workday_index + 20 = wd2.workday_index and
wd2.is_workday
(отказ от ответственности, это в PostgreSQL, поэтому у меня есть логическое значение. В Oracle, я думаю, вам нужно изменить это на целое число и сказать =1
)
Кроме того, для бонусавопрос, это также дает две разные опции для определения «рабочего дня», один с накатом вперед, а другой с наклоном назад (отсюда workday_index и workday_index_back).Например, если вам нужно что-то в субботу, а суббота не является рабочим днем, это означает, что вам нужно в пятницу.И наоборот, если что-то должно быть доставлено в субботу, а суббота не в рабочий день, то это означает, что это будет доступно в понедельник.Контекст работы с нерабочими днями отличается, и этот метод позволяет вам выбрать правильный.
В качестве конечной точки продажи этот параметр позволяет также определять выходные как нерабочие дни... и вы можете сделать это или не делать это;тебе решать.Решение разрешает любой вариант.Теоретически можно добавить еще два столбца только для выходных с индексом рабочего дня, которые предоставят вам оба варианта.