Re: Returning a set of dates

Поиск
Список
Период
Сортировка
От C. Bensend
Тема Re: Returning a set of dates
Дата
Msg-id ab42e85cc41d268f0ceabc86368d3c53.squirrel@webmail.stinkweasel.net
обсуждение исходный текст
Ответ на Returning a set of dates  ("C. Bensend" <benny@bennyvision.com>)
Список pgsql-sql
> http://www.postgresql.org/docs/8.4/interactive/plpgsql-control-structures.html#PLPGSQL-STATEMENTS-RETURNING
>
>CREATE OR REPLACE FUNCTION public.next_bill_date(d date, period
>interval,
>   i interval)
>  RETURNS SETOF date
> AS $function$
> DECLARE
>     max_date date;
>     due_date date;
> BEGIN
>     max_date := CURRENT_DATE + i;
>     due_date := d;
>     WHILE due_date + period <= max_date LOOP
>         RETURN NEXT due_date; -- add d to the result set
>         due_date := due_date + period;
>     END LOOP;
>     RETURN; -- exit function
> END;
> $function$ language plpgsql;
> testdb=# select next_bill_date('2011-06-11', '2 week', '3 month');
next_bill_date
> ----------------
>  2011-06-11
>  2011-06-25
>  2011-07-09
>  2011-07-23
>  2011-08-06
>  2011-08-20

Almost, but not quite - the d parameter is a bill's "start date",
and the function shouldn't show dates in the past.  So, when the
above function is called with say '2011-06-01' as the beginning
date, the function will happily return '2011-06-01' in the result
set, even though it's in the past.

I've modified it a bit.  I renamed the function arguments to be a
bit more descriptive, did a little more math, and added an IF
statement to not return any dates in the past:


CREATE OR REPLACE FUNCTION public.next_bill_date(d date, frequency  interval, daterange interval)RETURNS SETOF date
AS $function$
DECLARE   max_date date;   due_date date;
BEGIN   -- We need to add the epoch date and daterange together, to   -- get the "max_date" value.  However, this would
causeus   -- to lose the last due date in the result set.  Add one more   -- frequency to it so we don't lose that.
max_date:= CURRENT_DATE + frequency + daterange;   due_date := d;   WHILE due_date + frequency <= max_date LOOP
--Don't include dates in the past - we only want future       -- due dates for bills.       IF due_date >= CURRENT_DATE
     THEN           RETURN NEXT due_date;       END IF;       due_date := due_date + frequency;   END LOOP;   RETURN;
--exit function
 


This appears to work properly:

SELECT next_bill_date( '2011-06-01', '2 weeks', '3 months' );next_bill_date
----------------2011-06-152011-06-292011-07-132011-07-272011-08-102011-08-242011-09-07
(7 rows)

Thanks for all your help!  I'm not at all experienced with plpgsql,
so this was very much appreciated.  :)

Benny


-- 
"You were doing well until everyone died."                                   -- "God", Futurama






В списке pgsql-sql по дате отправления:

Предыдущее
От: Leif Biberg Kristensen
Дата:
Сообщение: Re: Subselects not allowed?
Следующее
От: Leif Biberg Kristensen
Дата:
Сообщение: Re: Subselects not allowed?