get first / last date of given week - Mailing list pgsql-general

From Lee Harr
Subject get first / last date of given week
Date
Msg-id BAY2-F7x2A9l4ATfGbg0006dd45@hotmail.com
Whole thread Raw
Responses Re: get first / last date of given week  (Jean-Luc Lachance <jllachan@sympatico.ca>)
List pgsql-general
I wrote a function to return the first date of a given week
(and a few related functions) :


-- return the first date in the given week
CREATE or REPLACE FUNCTION week_start(integer, integer) RETURNS date AS '
    DECLARE
        pyear ALIAS FOR $1;
        pweek ALIAS FOR $2;

        year_text text;
        year_start date;

        week_text text;
        interval_text text;
        week_interval interval;
        week_date date;
        week_year integer;

        day_interval interval := ''1 day'';

        wk integer;

    BEGIN
        IF pweek < 1 THEN
            RAISE EXCEPTION ''No negative week numbers'';
        END IF;
        IF pweek > 53 THEN
            RAISE EXCEPTION ''No week numbers over 53'';
        END IF;

        year_text := pyear-1 || ''-12-15'';
        year_start := year_text::date;

        interval_text := pweek || '' week'';
        week_interval := interval_text::interval;
        week_date := year_start + week_interval;

        wk := extract(week FROM week_date);
        WHILE wk <> pweek LOOP
            week_date := week_date + day_interval;
            wk := extract(week FROM week_date);
        END LOOP;

        week_year := extract(year FROM week_date);
        IF week_year > pyear THEN
            RAISE EXCEPTION ''No week 53 in this year'';
        END IF;

        RETURN week_date;
    END;
' LANGUAGE 'plpgsql';


-- return the first date in this current week
CREATE or REPLACE FUNCTION week_start() RETURNS date AS '
    DECLARE
        yr integer;
        wk integer;

    BEGIN
        yr := extract(year from current_date);
        wk := extract(week from current_date);

        RETURN week_start(yr, wk);

    END;
' LANGUAGE 'plpgsql';


-- return the last date in the given year/week
CREATE or REPLACE FUNCTION week_end(integer, integer) RETURNS date AS '
    DECLARE
        pyear ALIAS FOR $1;
        pweek ALIAS FOR $2;

    BEGIN
        RETURN week_start(pyear, pweek) + interval ''6 days'';

    END;
' LANGUAGE 'plpgsql';


-- return the last date in the current week
CREATE or REPLACE FUNCTION week_end() RETURNS date AS '
    DECLARE
        yr integer;
        wk integer;

    BEGIN
        yr := extract(year from current_date);
        wk := extract(week from current_date);

        RETURN week_end(yr, wk);

    END;
' LANGUAGE 'plpgsql';



Have a reinvented a wheel here?  (badly? ;o)
Is there a cookbook where I should post this code?

_________________________________________________________________
MSN 8 helps eliminate e-mail viruses. Get 2 months FREE*.
http://join.msn.com/?page=features/virus


pgsql-general by date:

Previous
From: Tom Lane
Date:
Subject: Re: max_fsm_pages
Next
From: mike g
Date:
Subject: Re: Extract data from MySQL database using PostgreSQL