2013-02-13 13 views
7

मैं सही सप्ताह की संख्या प्राप्त करने के लिए एक फ़ंक्शन बनाना चाहता हूं। मैंने पहले से ही 'देशी' समाधान खोजने के लिए here पोस्ट किया है, लेकिन स्पष्ट रूप से ऐसा नहीं है।फ़ंक्शन वर्ष का सही सप्ताह संख्या

मैं कोड PostgreSQL के लिए अनुवाद किया है इस mysql example

यहाँ के आधार पर funcrtion बनाने के लिए tryed:

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; 

लेकिन यह गलत परिणाम देता है, किसी ने मेरी मदद कर सकते?

मेरे config: PostgreSQL 9.2

उत्तर

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

फिर से धन्यवाद @Clodoaldo – Houari

0

inbuild निकालने समारोह के बारे में क्या?

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

नहीं, आप उदाहरण के लिए के साथ इस परीक्षण करें कि: '2005-01 से चयन निकालने (सप्ताह -01 ':: तिथि) 53 देता है, और 1 देना चाहिए, क्योंकि यह पहला सप्ताह है (माना जाता है कि शनिवार सप्ताह का पहला दिन है) – Houari

+0

@ हुरी एर, नहीं, ऐसा नहीं है। यह पिछले वर्ष के आखिरी सप्ताह का आखिरी हिस्सा है। सप्ताह की संख्याएं इस तरह बेवकूफ हैं और यह उन कारणों में से एक है जिनका व्यापक रूप से उपयोग नहीं किया जाता है। समझने के लिए कैलेंडर देखें। आईआईआरसी अगले वर्ष के सप्ताह 1 में भी पिछले वर्ष के आखिरी कुछ दिनों के दौरान शुरू हो सकता है। –

+0

@ क्रेग्रिंजर आप इस 'बेवकूफ' क्यों कह रहे हैं ?? ये आवश्यकताएं हैं, और मैं इसके लिए समाधान प्राप्त करना चाहता था !! – Houari

16

यदि आप चाहते हैं उचित सप्ताह नंबरों का उपयोग:

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

इस परिणाम 52, जो सही है अगर आप एक कैलेंडर पर देखने का उत्पादन करेगा।

अब, यदि आप वास्तव में सप्ताह के आंकड़ों को "वर्ष के पहले दिन से शुरू होने वाले हर 7 दिनों" के रूप में परिभाषित करना चाहते हैं, तो यह ठीक है, हालांकि यह सप्ताह की संख्या से मेल नहीं खाता है और किसी अन्य का उपयोग करता है और कुछ अजीब quirks है:

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

वैसे, स्ट्रिंग फ़ंक्शंस के साथ उन्हें तार स्ट्रिंग और हैकिंग करना लगभग हमेशा एक बुरा विचार है।

0

आप चलाकर सप्ताह और भी साल के सप्ताह के दिन प्राप्त कर सकते हैं:

select id,extract(DOW from test_date),extract(week from test_date), testdate,name from yourtable 
संबंधित मुद्दे