Años de 52 semanas

Definiciones
jueves, 4 de febrero de 2010

En cualquier sistema de reporting o de cuadro de mando se trabaja habitualmente con semanas, y se requiere numerar las semanas del año desde la primera hasta la última. A pesar de ser algo requerido en todos los proyectos Business Intelligence, y ser habitual en todas las empresas, existe poco consenso sobre la manera de numerar de las semanas.

Esta problemática aparece por varios motivos:

  • En algunos países las semanas comienzan los lunes, y otros consideran que el primer día de la semana es el domingo. En España, las semanas van de lunes a domingo.
  • Los años tienen un número variable de días (365 o 366), y en ningún caso es múltiplo de siete. Esto provoca que cada año tenga 52 o 53 semanas, y que irremediablemente existan semanas a caballo entre 2 años diferentes...

Por lo tanto... ¿Cuál es la primera semana del año?

Existen dos respuestas habituales: Podemos considerar que el 1 de enero pertenece a la primera semana del año, por definición. O podemos decir que la primera semana del año es aquella en la que la mayoría de los días pertenecen al nuevo año. Se entiende mejor con un ejemplo concreto... ¿Cuál es la primera semana del año 2010? ¿La del 1 de enero? ¿O la del 4 de enero?

Primeras semanas del año 2010

Afortunadamente, alguien intentó ordenar la situación estandarizando todo esto... Según la ISO 8601:

  • Las semanas comienzan los lunes
  • La primera semana del año incluye al primer jueves del año
  • Cada año tiene 52 o 53 semanas

Por cierto, la condición de que "la primera semana del año incluye al primer jueves del año" es completamente equivalente a estas dos:

  • El día 4 de enero siempre pertenece a la primera semana del año
  • La primera semana del año es aquella en la que la mayoría de días pertenecen al nuevo año

Desafortunadamente, nadie ha hecho demasiado caso a esta definición ISO. Prueba de ello, es que el Excel no tiene una función para calcular el número de la semana ISO, ni tampoco la incluyen la mayoria de bases de datos (SQL Server, por ejemplo, no ha definido ISO_WEEK hasta la versión SQL Server 2008). Seguramente, la falta de aceptación de este criterio se debe a que en Estados Unidos no tiene ningún sentido comenzar a numerar las semanas un lunes. En Europa, sigue siendo común considerar que el 1 de enero pertenece a la primera semana del año.

Desde el punto de vista analítico, además, las semanas ISO tampoco nos resultan útiles. Para entender por qué, es necesario comprender primero para que necesitan los usuarios el "número de semana"... Esta dimensión se utiliza en los informes semanales, donde se mira la evolución de un indicador respecto la semana anterior y/o respecto la semana equivalente del año anterior. En informes diarios también se utiliza un criterio similar... y se compara las ventas del día, respecto el mismo día de la semana anterior, y el día equivalente del año anterior. ¿Y cuál es el día equivalente del año anterior? ¡¡Pues el del mismo número de semana!!

Veamos un caso concreto. Hoy es jueves 4 de febrero del 2010. Según el criterio ISO, hoy es el jueves de la quinta semana del año 2010. El día equivalente del año anterior es el jueves de la quinta semana del año 2009... que según el criterio ISO corresponde al jueves 29 de enero del 2009...mmm... Esta respuesta nunca ha gustado a mis usuarios de negocio. Desde hace años, a mi tampoco (creo que fue en el 2005 cuando me convencieron). Según mis usuarios de negocio, el día equivalente es el jueves 5 de febrero del 2009.

Primeras semanas del año 2009. La relación correcta entre semanas equivalente se obtiene restando 52 semanas. Siempre.

Este problema aparece porque el año 2009 tuvo 53 semanas ISO... Es un problema recurrente. Ocurrió en 1998 y en el 2004, y volverá a ocurrir en 2015, 2020 y 2026... Que sólo ocurra cada 5 o 6 años, no impide que debamos afrontarlo... ya que durante todo el 2010 deberemos comparar las semanas con las equivalentes del 2009... ¿Cómo debemos, entonces, calcular la semana equivalente? Además, ¿Cuál seria la "semana equivalente" a la semana 53 del año 2009?

En un sistema Business Intelligence, con un objetivo analítico, considero que da igual como se numeren la semanas. Lo principal, lo imprescindible, es que cada año debe tener exactamente 52 semanas. De esta manera, para calcular el día equivalente del año anterior debemos restar 364 días (=52x7), para calcular el día equivalente de hace 2 años debemos restar 728 días (=2x52x7), etc. Una vez decidamos cual es la primera semana del año actual, ya podemos numerar todas las semanas pasadas y futuras, en grupos de 52...

Podemos considerar que la primera semana del año es la de 1 de enero, o la del primer jueves. Es igual. Si suponemos que la primera semana es la del primer jueves, numeraríamos las semanas pasadas y futuras de la siguiente forma (SQL Server):

(floor(datediff(d,CONVERT(datetime,'20100104',112),@fecha)/7.0)+52000)%52+1

Evidentemente, este "número de semana" debe estar precalculado en la tabla de tiempo de nuestro datawarehouse... Observad que en esta fórmula he tenido en cuenta que el lunes de la primera semana del año actual fue el 4 de enero del 2010... Esta formula funcionará sin problemas hasta el 2015....

Esta manera de numerar las semanas es útil en sistemas analíticos. La problemática descrita anteriormente es habitual en la industria del retail y en el de las telecomunicaciones, y en todos aquellos casos en los que se trabaja con informes diarios o semanales. La solución propuesta es una solución personal, heterodoxa, por lo que aprovecho para ponerla a vuesta consideración. ¿Existe el "número de semana" en vuestro datawarehouse? ¿Cuál es la primera semana del 2010? ¿Trabajas con el concepto de "semana equivalente"? ¿Cuál es la semana del 2009 equivalente a la primera semana del 2010?

Buff... Veo que me ha quedado un artículo algo denso... Quien no haya desayunado bien, no entenderá nada de nada... :-)

ACTUALIZACION: He escrito otro artículo sobre las semanas del año. He intentado ser más conciso...