Функция получение правильного количества недель в году

Я хочу создать функцию, чтобы получить правильное количество недель в году. Я уже написал здесь чтобы найти "родное" решение, но, по-видимому, его нет.

Я пытался создать funcrtion на основании этого mysql пример

вот код, переведенный на 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;

но это дает неправильный результат, может кто-то мне помочь ?

моя конфигурация: PostgreSQL 9.2

4 ответов


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

Если вы хотите правильные номера недели использовать:

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

Это даст результат 52, что правильно если вы посмотрите на календарь.

Теперь, если вы действительно хотите определить номера недель как "каждые 7 дней, начиная с первого дня года", это нормально, хотя это не соответствует номерам недель, которые кто-то использует, и имеет некоторые нечетные причуды:

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

кстати, разбор строк даты и взлом их с помощью строковых функций почти всегда является очень плохая идея.


насчет inbuild выдержка функция?

SELECT extract (week from current_timestamp) FROM A_TABLE_FROM_YOUR_DB;

вы можете получить день недели и номер недели в году работает:

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