大廈@劉若英的回答,這可以擴展到一般的(?通用)解決方案:
CREATE OR REPLACE FUNCTION recurring_dates (p_year IN NUMBER, p_rule IN VARCHAR)
RETURN dbms_stats.datearray PIPELINED
AS
start_dt DATE;
last_dt DATE;
next_dt DATE;
BEGIN
start_dt := to_date(to_char(p_year,'fm0000')||'01-01','YYYY-MM-DD');
last_dt := to_date(to_char(p_year,'fm0000')||'12-31','YYYY-MM-DD');
LOOP
dbms_scheduler.evaluate_calendar_string(
calendar_string => p_rule,
start_date => start_dt,
return_date_after => start_dt,
next_run_date => next_dt);
EXIT WHEN next_dt > last_dt;
PIPE ROW (next_dt);
start_dt := next_dt;
END LOOP;
END recurring_dates;
/
你會喂功能在DBMS_SCHEDULER
-Syntax中使用日曆字符串,並且它將返回匹配的日期。
@ rcmuthu786的最後一個星期四:
SELECT * FROM TABLE(recurring_dates (2013, 'FREQ=MONTHLY;BYDAY=-1 THU'));
2013-01-31
2013-02-28
2013-03-28
2013-04-25
2013-05-30
...
或者,每月的第二個星期三:
SELECT * FROM TABLE(recurring_dates (2013, 'FREQ=MONTHLY;BYDAY=2 WED'));
2013-01-09
2013-02-13
2013-03-13
2013-04-10
...
等等,等等......
考慮創建一個[日曆表](http://www.perpendulum.com/2012/06/calendar-table-script-for-oracle/),這樣的查詢變得非常非常容易。 – GarethD
我不是oracle用戶,你沒有提供任何東西供我們測試,但是如果你有一個月結束的列表,你可以把每個星期的一個星期拿出來,找出你需要拿走的東西星期四,然後從月底減去這個數字。 –
@StephLocke OP還能提供什麼,你期待什麼? –