Функция получение правильного количества недель в году
Я хочу создать функцию, чтобы получить правильное количество недель в году. Я уже написал здесь чтобы найти "родное" решение, но, по-видимому, его нет.
Я пытался создать 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