Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Function Getting the right week number of year

I want to create a function to get the right week number of year. I already posted here to find a 'native' solution, but apparently there is not.

I tryed to create funcrtion based on this mysql example

Here is the code translated to postgresql:

CREATE OR REPLACE FUNCTION week_num_year(_date date)    
RETURNS integer AS
$BODY$declare 
_year integer;
begin


select date_part('year',_date) into _year; 
return ceil((to_char(_date,'DDD')::integer+(to_char(('01-01-'||_year)::date,'D')::integer%7-7))/7);           


end;$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;

But it gives wrong result, can someone help me ?

My config: PostgreSQL 9.2

like image 383
Houari Avatar asked Feb 13 '13 14:02

Houari


2 Answers

If you want proper week numbers use:

select extract(week from '2012-01-01'::date);

This will produce the result 52, which is correct if you look on a calendar.

Now, if you actually want to define week numbers as "Every 7 days starting with the first day of the year" that's fine, though it doesn't match the week numbers anyone else uses and has some odd quirks:

select floor((extract(doy from '2011-01-01'::date)-1)/7)+1;

By the way, parsing date strings and hacking them up with string functions is almost always a really bad idea.

like image 75
Craig Ringer Avatar answered Nov 02 '22 03:11

Craig Ringer


create or replace function week_num_year(_date date)
returns integer as
$body$
declare
_year date;
_week_number integer;
begin
select date_trunc('year', _date)::date into _year
;
with first_friday as (
    select extract(doy from a::date) ff
    from generate_series(_year, _year + 6, '1 day') s(a)
    where extract(dow from a) = 5
)
select floor(
        (extract(doy from _date) - (select ff from first_friday) - 1) / 7
    ) + 2 into _week_number
;
return _week_number
;
end;
$body$
language plpgsql immutable
like image 6
Clodoaldo Neto Avatar answered Nov 02 '22 01:11

Clodoaldo Neto