2013-02-13 17 views
7

Doğru hafta numarasını almak için bir işlev oluşturmak istiyorum. Zaten 'yerel' bir çözüm bulmak için here gönderdim, ancak görünüşe göre yok. İşlev Doğru haftanın yıl sayısına ulaşılması

ben kod postgresql çevrilir İşte bu mysql example

dayalı funcrtion oluşturmak için uğraş:

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; 

Ama yanlış sonuç verir, birisi bana yardımcı olabilir?

Benim yapılandırma: İçerisine yerleştirilmiş özü işlevi hakkında

cevap

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

Teşekkür ederiz tekrar @ Clodoaldo – Houari

0

Ne PostgreSQL 9.2? İsterseniz

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

Hayır, mesela bu test ederseniz: 2005-01' den SEÇ özü (hafta -01 ':: date], 53 verir ve 1, beacause bu ilk hafta (cumartesi haftanın ilk günü olduğunu düşünüyor) – Houari

+0

@Houari Er, hayır, o değil. Önceki yılın son haftasının son kısmı. Hafta sayıları böyle aptalcadır ve yaygın olarak kullanılmalarının nedenlerinden biridir. Nedenini anlamak için takvime bakın. IIRC bazen gelecek yılın 1. haftası önceki yılın son birkaç günü de başlayabilir. –

+0

@CraigRinger Neden buna 'Stupid' diyorsun? Bunlar gereksinimleri ve bunun için çözüm almak istedim! – Houari

16

uygun Hafta numaralarını kullanın:

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

Bu, bir takvim üzerinde bakarsak doğru sonucu 52, üretecek.

Şimdi, eğer hafta sayılarını "Yılın ilk günü ile başlayan her 7 günde bir" olarak tanımlamak istiyorsanız, bu, başkalarının kullandığı haftalık sayılarla eşleşmese de bazı garip garipliklere sahip olsa da, bu iyi olur:

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

Bu arada, tarih dizelerini ayrıştırmak ve bunları dizge işlevleri ile kesmek neredeyse her zaman gerçekten kötü bir fikirdir.

0

Sen çalıştırarak da haftanın ve yılın hafta gününü alabilirsiniz:

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