Houari
Houari

Reputation: 5631

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

Upvotes: 8

Views: 13440

Answers (4)

Veeranjaneyulu .Kota
Veeranjaneyulu .Kota

Reputation: 61

You can retrieve the day of the week and also the week of the year by running:

   select  id,extract(DOW from test_date),extract(week from test_date), testdate,name from yourtable

Upvotes: 2

Clodoaldo Neto
Clodoaldo Neto

Reputation: 125244

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

Upvotes: 6

Craig Ringer
Craig Ringer

Reputation: 324455

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.

Upvotes: 17

OkieOth
OkieOth

Reputation: 3704

What about the inbuild extract function?

SELECT extract (week from current_timestamp) FROM A_TABLE_FROM_YOUR_DB;

Upvotes: 1

Related Questions