2013-02-13 5 views
7

Ich möchte eine Funktion erstellen, um die richtige Wochennummer des Jahres zu erhalten. Ich habe bereits here gepostet, um eine "native" Lösung zu finden, aber anscheinend gibt es keine.Funktion Die richtige Woche Nummer des Jahres

I funcrtion auf diese ist mysql example

Basis zu schaffen tryed Hier ist der Code zu postgresql übersetzt:

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; 

Aber es gibt falsches Ergebnis, kann mir jemand helfen?

Meine config: PostgreSQL 9.2

Antwort

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

Nochmals vielen Dank @Clodaldo – Houari

0

Was ist mit der inbuild Extrakt-Funktion?

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

Nein, wenn Sie diesen Test mit zum Beispiel: SELECT-Extrakt (Woche von ‚2005-01 -01 ':: Datum) gibt 53, und sollte 1 geben, weil dies die erste Woche ist (in Anbetracht, dass Samstag der erste Tag der Woche ist) – Houari

+0

@Houari Äh, nein, ist es nicht. Es ist der letzte Teil der letzten Woche des Vorjahres. Wochenzahlen sind so dumm und es ist einer der Gründe, warum sie nicht weit verbreitet sind. Schau in einen Kalender, um zu verstehen, warum. IIRC manchmal kann Woche 1 des nächsten Jahres auch in den letzten Tagen des vorherigen Jahres beginnen. –

+0

@CraigRinger Warum erzählst du das 'dumm' ?? Das sind Anforderungen, und ich wollte eine Lösung dafür bekommen !! – Houari

16

Wenn Sie die richtige Woche Zahlen wollen verwenden:

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

Dies wird produziert das Ergebnis 52, was richtig ist, wenn Sie in einem Kalender zu suchen.

Jetzt, wenn Sie wirklich Wochenzahlen als "Alle 7 Tage beginnend mit dem ersten Tag des Jahres" definieren möchten, ist das in Ordnung, obwohl es nicht die Wochenzahlen entspricht, die jemand anderes verwendet und einige seltsame Eigenarten hat:

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

Übrigens ist das Analysieren von Datumszeichenfolgen und das Hacken von ihnen mit Zeichenfolgenfunktionen fast immer eine wirklich schlechte Idee.

0

Sie können den Tag der Woche abrufen und auch die Woche des Jahres läuft:

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