Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

Obtener numero de semanas?

Estas en el tema de Obtener numero de semanas? en el foro de Mysql en Foros del Web. Quisiera saber de que manera de puede extraer el número de semana real al que peternece una fecha(yyy-mm-dd). En ambos casos me retorna 52, deberia ...
  #1 (permalink)  
Antiguo 08/07/2013, 16:20
Avatar de xpapachox  
Fecha de Ingreso: junio-2011
Mensajes: 77
Antigüedad: 12 años, 9 meses
Puntos: 12
Obtener numero de semanas?

Quisiera saber de que manera de puede extraer el número de semana real al que peternece una fecha(yyy-mm-dd).


En ambos casos me retorna 52, deberia retornarme 1.
select DATE_FORMAT('2011-01-01','%V');
select DATE_FORMAT('2011-01-01','%v');


En este caso me retorna 0.
select week('2011-01-01');

En este caso si me retorna 1.
select WEEK('2011-01-01' - INTERVAL -1 WEEK, 1);

De que manera se podria validar para que te el numero de semana correcta en todos los casos, para cualquier año.
  #2 (permalink)  
Antiguo 08/07/2013, 16:47
Avatar de 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, 4 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)

Etiquetas: numero, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 12:43.