Это можно сделать без функции PL / SQL. Просто вычтите различное количество дней в зависимости от дня недели:
select trunc(sysdate) - case to_char(sysdate, 'D')
when '4' then 3 -- thursday minus 3 days
when '5' then 3 -- friday minus 3 days
when '6' then 4 -- saturday minus 4 days
else 5 -- all other days minus 5 days
end
from dual;
Когда вы должны сделать это, например, 12 дней назад это выглядело бы как:
select trunc(sysdate) - case to_char(sysdate, 'D')
when '1' then 18 -- mondays minus 18 days (incl. 3 weekends)
when '2' then 18 -- tuesdays minus 18 days (incl. 3 weekends)
when '6' then 17 -- saturdays minus 17 days (incl. 2 weekends and a saturday)
else 16 -- all others minus 16 days (incl. 2 weekends)
end
from dual;
Обратите внимание, что день недели зависит от NLS_TERRITORY вашей базы данных (в Америке день 1 - воскресенье, в большинстве других день 1 - понедельник).