, PL/SQL PIPELINED :
CREATE OR REPLACE TYPE days_tbl AS TABLE OF DATE;
CREATE OR REPLACE FUNCTION days_for_month(basedate IN DATE)
RETURN days_tbl PIPELINED
AS
month VARCHAR(2);
thedate DATE := TRUNC(basedate,'MON');
BEGIN
LOOP
PIPE ROW(thedate);
EXIT WHEN thedate = LAST_DAY(thedate);
thedate := thedate + 1;
END LOOP;
END;
:
SELECT COLUMN_VALUE
FROM TABLE(days_for_month(SYSDATE))
WHERE TO_CHAR(COLUMN_VALUE,'FMDAY') = 'MONDAY';
( ), , :
SELECT COLUMN_VALUE
FROM TABLE(days_for_month(SYSDATE))
WHERE TO_CHAR(COLUMN_VALUE,'FMDAY') IN ('SUNDAY','SATURDAY');
:
" , ( ) 2015 ?".
SELECT COUNT(*)
FROM TABLE(days_for_month(TO_DATE('09-2015','MM-YYYY')))
WHERE TO_CHAR(COLUMN_VALUE,'FMDAY') IN ('MONDAY','TUESDAY','FRIDAY');
:
COUNT(*)
13
, :
SELECT T.D, COUNT(*)
FROM TABLE(days_for_month(TO_DATE('09-2015','MM-YYYY'))),
(SELECT 'MONDAY' AS D FROM DUAL UNION
SELECT 'TUESDAY' FROM DUAL UNION
SELECT 'FRIDAY' FROM DUAL) T
WHERE TO_CHAR(COLUMN_VALUE,'FMDAY') = T.D
GROUP BY T.D
:
D COUNT(*)
TUESDAY 5
FRIDAY 4
MONDAY 4