2013-02-13 17 views
7

Chcę utworzyć funkcję, aby uzyskać prawidłową liczbę tygodni w roku. Mam już opublikowany here, aby znaleźć rozwiązanie "native", ale najwyraźniej nie ma.Funkcja Uzyskiwanie prawidłowego tygodnia numer

tryed stworzyć funcrtion oparciu o ten mysql example

Oto kod tłumaczona na 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; 

Ale to daje zły wynik, może ktoś mi pomoże?

Mój config: PostgreSQL 9.2

Odpowiedz

6
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 
+0

Jeszcze raz dziękuję @ Clodoaldo – Houari

0

Co o funkcji ekstraktu inbuild?

SELECT extract (week from current_timestamp) FROM A_TABLE_FROM_YOUR_DB; 
+0

Nie, jeśli to sprawdzić używając np: SELECT ekstrakt (tydzień od „2005-01 -01 ':: date) daje 53, i powinno dać 1, ponieważ jest to pierwszy tydzień (biorąc pod uwagę, że sobota jest pierwszym dniem tygodnia) – Houari

+0

@Hariari Er, nie, nie jest. To ostatnia część ostatniego tygodnia poprzedniego roku. Liczby tygodni są tak głupie i to jeden z powodów, dla których nie są powszechnie stosowane. Spójrz na kalendarz, aby zrozumieć, dlaczego. IIRC czasami 1 tydzień następnego roku może rozpocząć się również w ciągu ostatnich kilku dni przed rokiem. –

+0

@CraigRinger Dlaczego mówisz to "głupie"? Są to wymagania, i chciałem znaleźć na to rozwiązanie !! – Houari

16

Jeśli chcesz użyć odpowiednie numery tygodniu:

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

To będzie produkować wynik 52, co jest poprawne, jeśli spojrzeć na kalendarz.

Teraz, jeśli rzeczywiście chcesz zdefiniować numery tygodniowe jako "Co 7 dni, począwszy od pierwszego dnia roku", jest to w porządku, ale nie pasuje do liczby tygodni, którą ktoś używa i ma dziwne dziwactwa:

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

Nawiasem mówiąc, analizowania łańcuchach daty i włamania je z funkcji napisu to prawie zawsze bardzo zły pomysł.

0

Można pobrać dzień tygodnia, a także tydzień roku, uruchamiając:

select id,extract(DOW from test_date),extract(week from test_date), testdate,name from yourtable 
Powiązane problemy