Dave Rolsky wrote:
On Tue, 3 May 2005, Flavio S. Glock wrote:

How about using a "view" to create a "lazy" sql recurrence.

For example:
 "FREQ=YEARLY;BYMONTH=3,6"

--- postgresql ---
CREATE TABLE YEARS ( N DATE UNIQUE PRIMARY KEY );
insert into years values ( date('1990-01-01') );
insert into years values ( date('1991-01-01') );
insert into years values ( date('1992-01-01') );
CREATE VIEW RECURR AS
   select ( n + interval '2 month' ) from years union
   select ( n + interval '5 month' ) from years;
----

The sql statements could be generated automatically using a DateTime::Format module.


That still won't handle "1st Sunday of the month" all that easily, as that's a more complex calculation.


It is not too difficult, actually:

CREATE VIEW MONTHS ( n ) AS
    select ( n + interval '2 month' ) from years union
    select ( n + interval '5 month' ) from years;

CREATE VIEW FIRST_WEEK_OF_MONTH ( n ) AS
    select ( n ) from MONTHS union
    select ( n + interval '1 day' ) from MONTHS union
    select ( n + interval '2 day' ) from MONTHS union
    select ( n + interval '3 day' ) from MONTHS union
    select ( n + interval '4 day' ) from MONTHS union
    select ( n + interval '5 day' ) from MONTHS union
    select ( n + interval '6 day' ) from MONTHS;

CREATE VIEW FIRST_SUNDAY AS
    select ( n ) from FIRST_WEEK_OF_MONTH
    where EXTRACT(DOW FROM n) = 0;

select * from FIRST_SUNDAY;
          n
---------------------
 1990-03-04 00:00:00
 1990-06-03 00:00:00
 1991-03-03 00:00:00
 1991-06-02 00:00:00
 1992-03-01 00:00:00
 1992-06-07 00:00:00
(6 registros)

- Flavio S. Glock

Reply via email to