You don't need a dynamic view... A month is always between 28 and 31 days so you could create a view that has 32 columns (employee + 31 days). Create a column per day with a case statement to determine that for that employee there is a shift. Here is an example for the 5 days of the month and the last 4 days of the month (you can easily fill in the remaining days):
WITH
FUNCTION is_valid_date (date_str_i VARCHAR2, format_i VARCHAR2) RETURN VARCHAR2
/* check if date is valid */
AS
l_dummy_dt DATE;
date_not_valid_for_m EXCEPTION;
PRAGMA EXCEPTION_INIT(date_not_valid_for_m, -01839);
BEGIN
SELECT TO_DATE(date_str_i,format_i) INTO l_dummy_dt FROM DUAL;
RETURN 'Y';
EXCEPTION WHEN date_not_valid_for_m THEN
RETURN 'N';
END;
mymonth(monthname,yr) AS (SELECT 'FEB','2020' FROM dual)
,mydata (employee, shift, the_from, the_to) AS
(SELECT 'Deepa', 'A',TO_DATE('02-FEB-2020','DD-MON-YYYY'),TO_DATE('31-MAY-2020','DD-MON-YYYY') FROM DUAL
UNION
SELECT 'Srini', 'M',TO_DATE('02-FEB-2020','DD-MON-YYYY'),TO_DATE('04-MAY-2020','DD-MON-YYYY') FROM DUAL
)
,myschedule (employee,day01,day02,day03,day04,day05,day28,day29,day30,day31)
AS
(
SELECT
d.employee,
CASE WHEN TO_DATE('01-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('02-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('03-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('04-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('05-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN TO_DATE('28-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END,
CASE WHEN is_valid_date(date_str_i => '29-'||m.monthname||'-'||m.yr,format_i => 'DD-MON-YYYY') = 'Y'
THEN
CASE WHEN TO_DATE('29-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END
ELSE
NULL
END,
CASE WHEN is_valid_date(date_str_i => '30-'||m.monthname||'-'||m.yr,format_i => 'DD-MON-YYYY') = 'Y'
THEN
CASE WHEN TO_DATE('30-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END
ELSE
NULL
END,
CASE WHEN is_valid_date(date_str_i => '31-'||m.monthname||'-'||m.yr,format_i => 'DD-MON-YYYY') = 'Y'
THEN
CASE WHEN TO_DATE('31-'||m.monthname||'-'||m.yr,'DD-MON-YYYY') BETWEEN d.the_from AND d.the_to THEN d.shift ELSE NULL END
ELSE
NULL
END
FROM mydata d,mymonth m
)
SELECT * FROM myschedule;
Now you're left with 1 issue and that is how to merge the rows for Krish and Rahul. You could do something like shown here: Oracle SQL: Merge rows into single row