Maybe this could answer your question:
WITH
tbl (A_DATE, A_VALUE) AS
(
Select TRUNC(SYSDATE) - 15 + LEVEL , 300 + LEVEL
From DUAL
Connect By LEVEL <= 14
),
grid AS
(
SELECT
A_DATE, A_VALUE,
To_Char(A_DATE, 'd') "DAY_NUM_OF_WEEK",
To_Char(A_DATE, 'DY') "DAY_OF_WEEK",
CASE
WHEN To_Char(A_DATE, 'DY') IN('MON', 'TUE') THEN A_DATE - 4
ELSE
A_DATE - 2
END "DAY_1",
CASE
WHEN To_Char(A_DATE, 'DY') = 'MON' THEN A_DATE - 3
ELSE
A_DATE - 1
END "DAY_2"
FROM
tbl
ORDER BY
A_DATE
)
Select
*
From
grid
Where
A_DATE = (Select DAY_1 From grid Where A_DATE = :Effective_Date)
OR
A_DATE = (Select DAY_2 From grid Where A_DATE = :Effective_Date)
/*
Result for :Effective_Date = '07-NOV-22' (MON)
A_DATE A_VALUE DAY_OF_WEEK
--------- ---------- -----------
03-NOV-22 304 THU
04-NOV-22 305 FRI
Result for :Effective_Date = '08-NOV-22' (TUE)
A_DATE A_VALUE DAY_OF_WEEK
--------- ---------- -----------
04-NOV-22 305 FRI
07-NOV-22 308 MON
Result for :Effective_Date = '09-NOV-22' (WED)
A_DATE A_VALUE DAY_OF_WEEK
--------- ---------- -----------
07-NOV-22 308 MON
08-NOV-22 309 TUE
*/
WITH clause (tbl) just generates some sample data to work with.
Here a CTE named grid is created to attach DAY_1 and DAY_2 dates according to your rules from the question. This way you have new columns to filter your data on within the main SQL.
NOTE: I didn't handle :Effective_Day on Sunday in CASE expression couse you said that weekends are excluded - you can do it if needed. Saturday will work fine anyway.
Regards...
ADDITION
after the comment...
SELECT
A_DATE,
To_Char(A_DATE, 'd') "DAY_NUM_OF_WEEK",
To_Char(A_DATE, 'DY') "DAY_OF_WEEK",
CASE
WHEN To_Char(A_DATE, 'DY') IN('MON', 'TUE') THEN A_DATE - 4
ELSE
A_DATE - 2
END "DAY_1",
CASE
WHEN To_Char(A_DATE, 'DY') = 'MON' THEN A_DATE - 3
ELSE
A_DATE - 1
END "DAY_2"
FROM
dual
ORDER BY
A_DATE
If you just want to get the days from given date use the above query putting your date instead of A_DATE. It will give the results as:
-- For A_DATE = '15-NOV-22'
-- A_DATE DAY_NUM_OF_WEEK DAY_OF_WEEK DAY_1 DAY_2
-- --------- --------------- ----------- --------- ---------
-- 15-NOV-22 2 TUE 11-NOV-22 14-NOV-22
--
-- For A_DATE = '10-NOV-22'
-- A_DATE DAY_NUM_OF_WEEK DAY_OF_WEEK DAY_1 DAY_2
-- --------- --------------- ----------- --------- ---------
-- 10-NOV-22 4 THU 08-NOV-22 09-NOV-22
With your db
SELECT
CASE
WHEN To_Char(Your_Date_Column, 'DY') IN('MON', 'TUE') THEN Your_Date_Column - 4
ELSE
Your_Date_Column - 2
END "DAY_1",
CASE
WHEN To_Char(Your_Date_Column, 'DY') = 'MON' THEN Your_Date_Column - 3
ELSE
Your_Date_Column - 1
END "DAY_2"
FROM
Your_Table
ORDER BY
Your_Date_Column
... Or you can join your table with selection from dual to get the days
... Or select days from dual in your selection list and/or where clause
... any way it suits you
Regards...
If your updated question means what it looks like - here is your updated solution:
select
*
from
holddbo.pos
Where
eff_date = CASE WHEN To_Char(A_DATE, 'DY') IN('MON', 'TUE') THEN A_DATE - 4 ELSE A_DATE - 2 END --DAY_1
OR
eff_date = CASE WHEN To_Char(A_DATE, 'DY') = 'MON' THEN A_DATE - 3 ELSE A_DATE - 1 END; --DAY_2
just put your date ( '15-NOV-2022' ) in place of A_DATE