You can use:
SELECT date_value,
added_weekdays,
weekday_date_value
+ MOD(added_weekdays, 5) -- Number of days of part week
+ FLOOR(added_weekdays / 5) * 7 -- Number of full weeks
+ CASE TRUNC( weekday_date_value + MOD(added_weekdays, 5) )
- TRUNC( weekday_date_value + MOD(added_weekdays, 5), 'IW' )
WHEN 5 THEN 2
WHEN 6 THEN 1
ELSE 0 END -- Shift value if it falls on a weekend.
AS final_value
FROM (
SELECT t.*,
date_value
+ CASE TRUNC(date_value) - TRUNC(date_value, 'IW')
WHEN 5 THEN 2
WHEN 6 THEN 1
ELSE 0 END AS weekday_date_value -- Shift the start date if it is on
-- a weekend.
FROM table_name t
)
Which, for the sample data:
CREATE TABLE table_name ( date_value, added_weekdays ) AS
SELECT DATE '2021-07-07', 10 FROM DUAL UNION ALL
SELECT DATE '2021-07-07', 11 FROM DUAL UNION ALL
SELECT DATE '2021-07-07', 12 FROM DUAL UNION ALL
SELECT DATE '2021-07-07', 13 FROM DUAL UNION ALL
SELECT DATE '2021-07-10', 0 FROM DUAL UNION ALL
SELECT DATE '2021-07-10', 1 FROM DUAL;
Outputs (with the date format of YYYY-MM-DD (DY)
):
DATE_VALUE |
ADDED_WEEKDAYS |
FINAL_VALUE |
2021-07-07 (WED) |
10 |
2021-07-21 (WED) |
2021-07-07 (WED) |
11 |
2021-07-22 (THU) |
2021-07-07 (WED) |
12 |
2021-07-23 (FRI) |
2021-07-07 (WED) |
13 |
2021-07-26 (MON) |
2021-07-10 (SAT) |
0 |
2021-07-12 (MON) |
2021-07-10 (SAT) |
1 |
2021-07-13 (TUE) |
db<>fiddle here