Hace 24 semanas escribí un artículo analizando el problema de numerar las semanas del año. Se trataba de un artículo extenso, y denso, y sin embargo sigue recibiendo muchas visitas de gente que busca información sobre las "52 o 53 semanas del año", "las semanas del 2010", "semanas ISO", "cómo numerar semanas del año" u otras búsquedas semejantes...
Intentaré hoy ser más claro y conciso, ya que se trata de un tema que tarde o temprano aparece en los proyectos de Business Intelligence... (en mil informes y cuadros de mando se comparan las ventas con las fechas equivalentes del año anterior...)

En aquella ocasión comentaba que la ISO intentó ordenar los diferentes criterios que habitualmente se utilizan definiendo que:
Este criterio presenta la deficiencia de que no todos los años tienen el mismo número de semanas. La mayoría de años tienen 52 semanas, aunque algunos años tienen 53 semanas. Por ejemplo, según la ISO, la semana 53 del 2009 transcurrió placidamente entre el 29 de diciembre del 2009, y el 4 de enero del 2010. ¿Acaso la semana 53 del 2009 no tendrá una semana comparable en el 2010?
Se trata de una deficiencia relevante desde el punto de vista analítico. Si no podemos comparar la semana 53 con la semana 53...¿Qué sentido tiene comparar la primera con la primera? ¿O la 29 con la 29?
En mi opinión, desde el punto de vista analítico, debemos olvidarnos del criterio ISO y de cualquier sistema de numeración que conlleve los mismos problemas (y esto incluye a todas las funciones "week number" que ofrecen los motores de bases de datos)…
Comenzaba el artículo diciendo que hace 24 semanas escribía un artículo similar a éste. Lo puedes comprobar cogiendo un calendario y contando hacia atrás 24 semanas. Con este sencillo método, si sigues contando hacia atrás, verás que hace exactamente 52 semanas era jueves 23 de julio del 2009. Casi como hoy.
Y ésa es precisamente la semana “equivalente” a la actual. Que diga la ISO lo que quiera. Para comparar semanas de años consecutivos, debemos avanzar o retroceder 52 semanas. De la misma manera, podremos comparar con la semana equivalente de hace 2, 3, 4… años… (restando 104, 156, 208 … semanas respectivamente).
Tal vez, con una imagen se ve mejor. Observad la equivalencia lógica entre las semanas del 2010 y la del 2009… Las flechas azules relacionan semanas con 52 semanas de diferencia...

Categoría: Definiciones
Palabras clave: Cuadros de mando
Comentarios: Este artículo tiene 5 comentarios.¡Deja un comentario!
Que tal leí tu articulo anterior, pero tengo una duda en el query en el que numeras las semanas pasadas y futuras”(floor(datediff(d,CONVERT(datetime,'20100104',112),@fecha)/7.0)+52000)%52+1, no me queda claro el porque de 52000)%52 si( 52000%52 = 0), espero que me puedas aclarar.
Saludos
Se trata de un ajuste "fantasma" para que la fórmula funcione bien con fechas pasadas... El FLOOR de un número negativo, devuelve el entero más pequeño...
El día que escribí el primer artículo me aseguré mucho que de que la fórmula fuese correcta. Y creo que lo es.
La fórumla es rara, sin duda. Pero no supe encontrar una manera más concisa de hacerlo... Si alguien la encuentra, que lo diga...
Intento explicarla...
La función datediff() devuelve el número de días entre la @fecha y el 4 de enero del 2010 (que fijamos como semana 1, por ser la la semana 1 del año actual, según ISO)...
Si lo compruebas, verás que han pasado 207 días desde el 4 de enero. Efectivamente:
select datediff(d,CONVERT(datetime,'20100104',112),GETDATE())
Al dividir por 7, obtenemos el número de semanas de diferencia entre la fecha y ése 4 de enero...
Efectivamente, han pasado 29 semanas, y por lo tanto estamos en la semana 30
select floor(207/7.0)+1
Como queremos contar en grupos de 52, sólo debemos hacer el módulo 52... Y sigue dándonos que estamos en la semana 30
select floor(207/7.0)%52+1
Este procedimiento funciona bien para fechas posteriores al 4 de enero... Pero, ¿Qué pasa con las fechas anteriores?
Por ejemplo, para el 1 de enero del 2010 la función datediff() dice que han pasado -3 días...
...y al dividir entre 7 nos dice que corresponde con la semana 0 (efectivamente, es la semana anterior a la semana 1):
select floor(-3/7.0)%52+1
...pero esa semana no queremos que sea la 0, queremos que sea la 52...Y aquí aparece el 52000 (valdría cualquier múltiplo de 52 suficientemente grande)...
select (floor(-3/7.0)+52000)%52+1
En fin... Que creo que funciona...
Y si calculas el número de semana de esta manera, ningún usuario se quejará ni se extrañará de nada... aunque también tienes la opción de mostrar la semana ISO pero calcular las "ventas equivalentes del año anterior" siguiendo el criterio expuesto...
Para acabarlo de pulir, se debería sustituir la fecha mágica del 20100104 por el lunes de la primera semana ISO del año en curso...
Si tenía algún lector, después de este rollo, seguro que lo he perdido :-)
Por cierto, como muestra del cacao que suponen la gestión de las fechas (¿O deberia decir la gestión de las culturas?), basta mirar el funcionamiento de la funcion DATEDIFF en SQL Server,
En teoría, DATEDIFF(ww,@fecha1,@fecha2) debería darnos el número de semanas entre dos fechas, con lo que se simplificaría mucho la anterior fórmula...
El problema es que DATEDIFF considera las semanas comienzan los domingos (¡¡e ignora el parámetro @@datefirst)...
Compruébalo:
SET DATEFIRST 1
SELECT DATEDIFF(ww,CONVERT(datetime,'20100103',112),CONVERT(datetime,'20100104',112))
..que indica que ese domingo y lunes pertenecen a la misma semana (ohhh!)
La buena noticia es que SQL Server 2008 incorpora una función para calcular la semana ISO:
SELECT DATEPART(ISO_WEEK,GETDATE()) ;
...ahora ya solo falta que lo añadan al Excel...
Encima del rollo que te he metido, era inexacto.
El problema no está en la función FLOOR... Le sumo 52000 porque el módulo (o residuo) de un número negativo es negativo (al menos en SQL Server...).
Yo quiero que el resultado sea siempre entre 1 y 52, ambos positivos. Yo pensaba que el módulo 52 me daría números entre 0 y 51, y sumándole 1 daría entre 1 y 52, como quiero.
El problema es que en SQL Server la función módulo devuelve números negativos
En SQL Server, la siguiente instrucción da 0:
SELECT (-1)%52+1
En cambio, en Excel el equivalente devuelve 52:
RESIDUO(-1;52)+1
¿algún matemático que nos lo aclare?
Ok, muchas gracias por contestar, ya me quedo claro, felicidades, buen blog lo estaré siguiendo.
Las metodologías Business Intelligence utilizan la información para mejorar la gestión de las empresas.
Gracias al software de BI, los usuarios pueden acceder y analizar los datos con facilidad, y tomar mejores decisiones.