2012-03-08 17 views
8

ho alcuni ordini in una tabella e l'ultima data ordine del 2011 è 20 dicembreSQL Server restituisce settimana inaspettato numero

sto usando un comando SQL per calcolare il numero di ordini in una settimana:

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 

mi restituisce il alcuni dei seguenti risultati:

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

il problema di questo è che è l'ultima data ordine del 2011, come detto, che ho è 20 Dicembre 2011, che non può essere noi ek 52 così deve essere la settimana 51.

Ho alcune altre statistiche (su un altro sistema, non su SQL server) che mi danno alcune altre cifre e l'ultima settimana su di esso è 51 che non ho alcun dubbio è corretta. Quindi ci saranno delle domande se le persone guarderanno entrambe!

Qualcuno ha qualche idea o sa come ordinare questo?

Grazie,

+0

trovato questo interessante per il 2012 .. http://wiki.answers.com/Q/How_many_weeks_in_the_year_2012 –

+1

@WilliamDwyer il link non è corretto. Iso_week è determinato dal numero di giovedì dell'anno. Quindi una settimana (dal lunedì alla domenica) dove giovedì è il secondo giovedì dell'anno è considerata la settimana 2. –

risposta

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

dovrebbe dare il numero della settimana.

+1

Penso che tu abbia qualche sintassi VB in là. Dovrebbe essere scritto 'WEEK' senza virgolette, non' "ww" '. (Sì, so che SQL Server accetta ww ma perché non lo spelling, quindi è chiaro se è giorno della settimana, numero della settimana, ecc.? 'W',' wk' e 'ww' sono tutti abbreviati supportati, puoi recitarli? Vedi http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx ...) –

+0

Sempre Seguendomi su non sei tu @ AaronBertrand - Grazie per il consiglio - lo modificherò. :-) – Bridge

+0

Non pensare che ti stia prendendo in giro o che ti stia seguendo in modo specifico. Sto cercando di impedire a molte persone di perpetuare pratiche di codifica scadenti. –

1

SQL Conta una settimana come domenica-sabato, è possibile utilizzare il seguente script per vedere come le settimane scoppiano per il 2011. Il 1 ° gennaio è un sabato, il che significa che la prima settimana è solo 1 giorno. Ci sono 53 settimane di SQL nel 2011, e 53 settimane nella maggior parte degli anni

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 

Se si desidera modificare i conteggi giorno SQL come il primo della settimana, è possibile utilizzare il comando DATEFIRST

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

0

così fanno

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

vedere ciò che è settimana 52 non ciò che si pensa è 52.

PS Dato che stai iniziando la settimana 1 con 1/1 non è possibile avere un anno di 52 settimane, a meno che 1 e o 52 non siano sette giorni di settimana.

10

L'iso_week del 20 dicembre 2011 è 51. Quindi forse è quello che ti serve.

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

fyi: Il calcolo per la prima iso_week varia in base alla locale (penso che lo standard sia la settimana del primo giovedì), quindi è possibile avere 53 o 54 settimane in un anno. –

+3

@ Ben: In realtà, con 'WEEK' puoi avere 53 o 54 settimane. Con 'ISO_WEEK' avrai 52 o 53 (perché quello sarebbe il numero di giovedì in un dato anno). –

+1

Sono d'accordo con Andriiy M. @ben iso_week non varia da nulla (è per questo che si chiama iso_week). –

Problemi correlati