迭代方法,基于 PL/SQL PIPELINED functions:
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 年 9 月有多少个星期一、星期二和星期五(或任何日子)?”。
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