0

Oracleで2013年の毎月の最後の木曜日を取得するには? この日付をテーブルに更新する必要があります。

次のような出力が必要です

Last Thursday in a year 2013 
----------------------
31.01.2013
28.02.2013
28.03.2013
24.04.2013
30.05.2013
27.06.2013
25.07.2013
29.08.2013
26.09.2013
31.10.2013
28.11.2013
26.12.2013

必要なことをしてくれてありがとう。

4

4 に答える 4

4

私は一緒に行きdbms_schedulerます:

declare
  start_dt              date := date '2013-01-01';
  months_last_thursday  date;

begin

  loop

    dbms_scheduler.evaluate_calendar_string (

       calendar_string   => 'FREQ=MONTHLY;BYDAY=-1 THU',
       start_date        =>  start_dt,
       return_date_after =>  start_dt, 
       next_run_date     =>  months_last_thursday

    );

    exit when months_last_thursday > date '2013-12-31';

    dbms_output.put_line(months_last_thursday);

    start_dt := months_last_thursday;

  end loop;
end;
/
于 2013-06-20T13:02:26.600 に答える
0

@Reneの回答に基づいて、これは一般的な(一般的な?)ソリューションに拡張できます。

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;
/

-Syntax でカレンダー文字列を関数にDBMS_SCHEDULER入力すると、一致する日付が返されます。

@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
...

または、毎月第 2 水曜日:

SELECT * FROM TABLE(recurring_dates (2013, 'FREQ=MONTHLY;BYDAY=2 WED'));
2013-01-09
2013-02-13
2013-03-13
2013-04-10
...

などなど…

于 2013-06-20T14:40:47.993 に答える