2012-03-08 19 views
8

tengo algunos pedidos en una mesa y la última fecha de la orden de 2011 es el 20 de diciembreSQL Server devuelve la semana inesperada número

estoy usando un comando SQL para calcular el número de pedidos en una semana:

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 

me devuelve el algunos de los siguientes resultados:

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

el problema con esto es que es la última fecha de la orden de 2011, como se ha mencionado que tengo es el 20 dic 2011, por lo que no puede seamos ek 52 así que debe ser la semana 51.

Tengo algunas otras estadísticas (de otro sistema, no servidor SQL) que me da algunas otras cifras y la última semana es 51 que no tengo ninguna duda es correcta. ¡Así que habrá una consulta si la gente mira a los dos!

¿Alguien tiene alguna idea o sabe cómo ordenar esto?

Gracias,

+0

ha encontrado interesante para el año 2012 .. http://wiki.answers.com/Q/How_many_weeks_in_the_year_2012 –

+1

@WilliamDwyer el enlace es incorrecto. Iso_week está determinada por el número de jueves del año. Entonces, una semana (de lunes a domingo) donde el jueves es el segundo jueves del año se considera la semana 2. –

Respuesta

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

deben darle el número de semana.

+1

Creo que tienes alguna sintaxis de VB allí. Debe escribirse 'SEMANA 'sin comillas dobles, no' "ww" '. (Sí, sé que SQL Server acepta ww, pero ¿por qué no deletrearlo para que quede claro si es día de la semana, número de semana, etc.? 'W',' wk' y 'ww' son taquillas admitidas, ¿puedes recitarlas? t. Consulte http://sqlblog.com/blogs/aaron_bertrand/archive/2011/09/20/bad-habits-to-kick-using-shorthand-with-date-time-operations.aspx ...) –

+0

Always Sígueme por aquí no eres @AaronBertrand - Gracias por el consejo - Lo editaré. :-) – Bridge

+0

No crea que lo estoy molestando o siguiéndolo específicamente. Estoy tratando de evitar que mucha gente perpetúe prácticas de codificación deficientes. –

1

SQL Cuenta una semana como de domingo a sábado, puede utilizar el script a continuación para ver cómo transcurren las semanas de 2011. El 1 de enero es un sábado, lo que significa que la primera semana es de solo 1 día. Hay 53 semanas de SQL en 2011, y 53 semanas en la mayoría de los años

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 

Si desea cambiar los conteos día SQL como el primero de la semana, puede utilizar el comando DATEFIRST

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

0

también lo hacen

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

ver lo que es la semana 52 no lo creo que es 52.

PD Dado que está comenzando la semana 1 en el 1/1, no es posible tener un año de 52 semanas, a menos que 1 y 52 no sean semanas de siete días.

10

La iso_week del 20 de diciembre de 2011 es 51. Entonces tal vez eso es lo que necesita.

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

fyi: El cálculo para la primera iso_week varía según la configuración regional (creo que la norma es la semana del primer jueves) por lo que es posible tener 53 o 54 semanas en un año. –

+3

@Ben: en realidad, es con 'SEMANA 'que puede tener 53 o 54 semanas. Con 'ISO_WEEK' tendrá 52 o 53 (porque ese sería el número de jueves en un año determinado). –

+1

Estoy de acuerdo con Andriiy M. @ben iso_week no varía en nada (es por eso que se llama iso_week). –

Cuestiones relacionadas