2013-02-13 19 views
7

Desidero creare una funzione per ottenere il numero dell'anno della settimana giusta. Ho già pubblicato here per trovare una soluzione "nativa", ma a quanto pare non c'è.Funzione Ottenere il numero dell'anno della settimana giusta

Ho provato a creare funcrtion sulla base di questa mysql example

Qui è il codice tradotto a 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; 

ma dà risultato sbagliato, qualcuno può aiutarmi?

mio config: PostgreSQL 9.2

risposta

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

Grazie ancora @Clodoaldo – Houari

0

E la funzione di estratto di inbuild?

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

No, se si prova questo con ad esempio: estratto SELECT (settimana da '2005-01 -01 ':: date) dà 53, e dovrebbe dare 1, perché questa è la prima settimana (considerando che sabato è il primo giorno della settimana) – Houari

+0

@Houari Er, no, non lo è. È l'ultima parte dell'ultima settimana dell'anno precedente. I numeri della settimana sono stupidi come questo ed è uno dei motivi per cui non sono ampiamente utilizzati. Guarda su un calendario per capire perché. IIRC a volte la settimana 1 del prossimo anno può iniziare anche negli ultimi giorni dell'anno precedente. –

+0

@CraigRinger Perché stai dicendo questo 'Stupido' ?? Questi sono requisiti e volevo ottenere una soluzione per questo !! – Houari

16

Se volete numeri di settimana corretto utilizzo:

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

Questo produrrà i risultati 52, il che è corretto se si guarda su un calendario.

Ora, se in realtà si desidera definire i numeri della settimana come "Ogni 7 giorni che iniziano con il primo giorno dell'anno" va bene, anche se non corrisponde ai numeri delle settimane che nessun altro utilizza e presenta alcuni strani accorgimenti:

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

A proposito, stringere le stringhe di data e hackerarle con le funzioni di stringa è quasi sempre una pessima idea.

0

È possibile recuperare il giorno della settimana e anche la settimana dell'anno eseguendo:

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