Ver Mensaje Individual
  #2 (permalink)  
Antiguo 08/07/2013, 16:47
Avatar de gnzsoloyo
gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 5 meses
Puntos: 2658
Respuesta: Obtener numero de semanas?

En realidad no es un error, sino una característica del WEEK(), con respecto a la cantidad de días que hay del año 2011 en esa semana.
Tienes que leer con cuidado y probar los ejemplos del manual, para entenderlo completamente:
Cita:
WEEK(date[,mode])

Esta función retorna el número de semana para date. La forma de dos argumentos de WEEK() le permite especificar si la semana comienza en lunes o domingo y si el valor de retorno debe estar en el rango de 0 a 53 o de 1 a 53. Si el argumento mode se omite en MySQL 5.0, el valor de la variable de sistema default_week_format se usa. Consulte Sección 5.3.3, “Variables de sistema del servidor”.

La siguiente tabla describe cómo funciona el argumento mode :
Cita:
Primer día
Modo de semana Rango Semana 1 es la primera semana...
0 Domingo 0-53 con un domingo en este año
1 Lunes 0-53 con más de 3 días este año
2 Domingo 1-53 con un domingo este año
3 Lunes 1-53 con más de 3 días este año
4 Domingo 0-53 con más de 3 días este año
5 Lunes 0-53 con un lunes en este año
6 Domingo 1-53 con más de 3 días este año
7 Lunes 1-53 con un lunes en este año
Código MySQL:
Ver original
  1. mysql> SELECT WEEK('1998-02-20');
  2.         -> 7
  3. mysql> SELECT WEEK('1998-02-20',0);
  4.         -> 7
  5. mysql> SELECT WEEK('1998-02-20',1);
  6.         -> 8
  7. mysql> SELECT WEEK('1998-12-31',1);
  8.         -> 53

Tenga en cuenta que si una fecha cae en la última semana del año prévio, MySQL retorna 0 si no usa 2, 3, 6, o 7 con el argumento opcional mode :
Código MySQL:
Ver original
  1. mysql> SELECT YEAR('2000-01-01'), WEEK('2000-01-01',0);
  2.         -> 2000, 0

Se podría argumentar que MySQL debería retornar 52 para la función WEEK() , ya que la fecha dada ocurre en la 52a semana de 1999. Decidimos retornar 0 en su lugar porque queríamos que la función devolviera “el número de semana en el año dado.” Esta hace uso de la función WEEK() fiable combinada con otras funciones que extraen una parte de fecha de una fecha.

Si prefiere que el resultado a ser evaluado respecto al año que contiene el primer día de la semana para la fecha dada, debe usar 0, 2, 5, o 7 como el argumento mode opcional.
Código MySQL:
Ver original
  1. mysql> SELECT WEEK('2000-01-01',2);
  2.         -> 52

Alternativamente, use la función YEARWEEK():
Código MySQL:
Ver original
  1. mysql> SELECT YEARWEEK('2000-01-01');
  2.         -> 199952
  3. mysql> SELECT MID(YEARWEEK('2000-01-01'),5,2);
  4.         -> '52'
En esencia el problema es que el 01/01/2011, cayó sábado, por lo que el cálculo de una semana recién comienza a correr el día 2:
Código SQL:
Ver original
  1. mysql> SELECT WEEK('2011-01-02');
  2. +--------------------+
  3. | WEEK('2011-01-02') |
  4. +--------------------+
  5. |                  1 |
  6. +--------------------+
  7. 1 ROW IN SET (0.00 sec)
para calcular semanas fraccionarias así, deberás hacer una consulta... algo más complicada.

Por cierto: Estás escribiendo mal la función, además de usar innecesariamente el DATE_FORMAT(). Esa segunda función es para convertir fechas en cadenas de texto, y no para que tome las cadenas de texto como fecha.
Lee el manual.
http://dev.mysql.com/doc/refman/5.0/es/functions.html
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)