2012-03-08 13 views
8

मैं एक मेज और 2011 के अंतिम आदेश की तारीख में कुछ आदेश 20 वीं है दिसम्बरएसक्यूएल सर्वर रिटर्न अप्रत्याशित सप्ताह के नंबर

मैं गए सप्ताह में आदेश की संख्या की गणना करने के लिए एक एसक्यूएल आदेश का उपयोग कर रहा हूँ:

SELECT CONVERT(VARCHAR(3),DATENAME(week,convert(datetime,order_date,103))) AS week, 
    COUNT(1) as orders 
FROM order_table 
where DATENAME(YEAR,convert(datetime,order_date,103)) = '2011' 
GROUP BY CONVERT(VARCHAR(3),DATENAME(week,convert(datetime,order_date,103))) 
order by week asc 

यह मुझे ये परिणाम मिलते हैं:

Week | Orders 
41 | 42 
42 | 110 
43 | 115 
... 
... 
51 | 155 
52 | 15 

इस के साथ परेशानी यह है कि 2011 के अंतिम आदेश की तारीख के रूप में उल्लेख मेरे पास है कि 20 दिसंबर 2011, है जो नहीं कर सकते हम बनो एके 52 तो सप्ताह 51 होना चाहिए।

मुझे कुछ अन्य आंकड़े मिल गए हैं (एक अन्य सिस्टम से, एसक्यूएल सर्वर नहीं) जो मुझे कुछ अन्य आंकड़े दे रहा है और पिछले सप्ताह यह 51 है, जिसमें मुझे कोई संदेह नहीं है। तो अगर लोग दोनों देख रहे हैं तो एक प्रश्न होने जा रहे हैं!

किसी को भी कोई विचार है या पता है कि इसे कैसे हल करें?

धन्यवाद,

+0

के लिए 2012 .. http://wiki.answers.com/Q/How_many_weeks_in_the_year_2012 –

+1

@WilliamDwyer यह रोचक लगा लिंक सही नहीं है। Iso_week वर्ष के गुरुवार की संख्या से निर्धारित किया जाता है। तो एक सप्ताह (सोमवार से सोमवार) जहां गुरुवार वर्ष का दूसरा गुरुवार सप्ताह 2 माना जाता है। –

उत्तर

0
SELECT DatePart(WEEK,order_date) AS WeekOfYear 
FROM order_table 

आप सप्ताह के नंबर देना चाहिए।

+1

मुझे लगता है कि आपके पास कुछ वीबी वाक्यविन्यास है। 'डबल' उद्धरण के साथ 'WEEK' लिखा जाना चाहिए, न कि "ww" '। (हां, मुझे पता है कि SQL सर्वर ww स्वीकार करता है लेकिन क्यों इसे स्पेल नहीं करता है, इसलिए यह स्पष्ट है कि यह सप्ताहांत, सप्ताह, इत्यादि है या नहीं? 'W',' wk' और 'ww' सभी समर्थित हैं, क्या आप उन्हें पढ़ सकते हैं? मैं' टी। http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx देखें ...) –

+0

हमेशा मेरे बारे में मेरे बारे में @AaronBertrand नहीं हैं - सलाह के लिए धन्यवाद - मैं इसे संपादित करूंगा। :-) – Bridge

+0

ऐसा नहीं लगता कि मैं आपको चुन रहा हूं या विशेष रूप से आपका अनुसरण कर रहा हूं। मैं बहुत से लोगों को खराब कोडिंग प्रथाओं को कायम रखने से रोकने की कोशिश कर रहा हूं। –

1

एसक्यूएल रविवार-शनिवार के रूप में एक सप्ताह की गणना करता है, आप 2011 के लिए सप्ताहों को तोड़ने के तरीके के नीचे नीचे दी गई स्क्रिप्ट का उपयोग कर सकते हैं। पहला जनवरी शनिवार है, जिसका अर्थ है कि पहला सप्ताह केवल 1 दिन है। वहाँ सबसे अधिक वर्षों

DECLARE @dStartDate DATETIME 

SET @dStartDate = '01/01/2011' 

WHILE @dStartDate < '01/01/2012' 
BEGIN 

PRINT CONVERT(VARCHAR, @dStartDate, 101) 
     + ' : ' 
     + CONVERT(VARCHAR, DATEPART(WEEK, @dStartDate)) 
     + ' : ' 
     + DATENAME(DW, @dStartDate) 

SET @dStartDate = @dStartDate + 1 

END 

आप सप्ताह के पहले के रूप में दिन एसक्यूएल मायने रखता है बदलना चाहते हैं, तो आप DATEFIRST आदेश का उपयोग कर सकते हैं में 2011 में 53 एसक्यूएल सप्ताह, और 53 सप्ताह कर रहे हैं

http://msdn.microsoft.com/en-us/library/ms181598.aspx

0

तो कर

Select * from order_table Where DatePart(Week, order_date) = 52 

देखें सप्ताह 52 क्या है नहीं कि आप क्या सोचते है 52.

पीएस आपने 1/1 पर सप्ताह 1 शुरू कर दिया है, यह 52 सप्ताह का साल संभव नहीं है, जब तक कि 1 और 52 सात दिन के सप्ताह न हों।

10

20 दिसंबर 2011 का iso_week 51 है। तो शायद यही आपको चाहिए।

SELECT datepart(iso_week, '2011-12-20') 
+0

fyi: पहली iso_week की गणना लोकेल द्वारा भिन्न होती है (मुझे लगता है कि मानक पहले गुरुवार का सप्ताह है) इसलिए साल में 53 या 54 सप्ताह हो सकते हैं। –

+3

@ बेन: दरअसल, यह 'सप्ताह' के साथ है कि आपके पास 53 या 54 सप्ताह हो सकते हैं। 'ISO_WEEK' के साथ आपके पास 52 या 53 होगा (क्योंकि यह किसी भी वर्ष में गुरुवार की संख्या होगी)। –

+1

मैं एंड्री एम के साथ सहमत हूं। @ बेन iso_week कुछ भी भिन्न नहीं है (यही कारण है कि इसे iso_week कहा जाता है)। –

संबंधित मुद्दे