Informes semanales: una mirada interna a los resultados del formato semanal en Oracle Database y SQL Server

Los informes semanales generalmente son solicitados por clientes que desean seguir los resultados de su actividad por semanas consecutivas de lunes a domingo. La forma más común de recopilar datos semanales es agrupando los rangos de fechas por su número de semana del año. 

Como verá en esta publicación, cuando comencé a investigar este tema, encontré información interesante sobre el formato de semana en Oracle Database y SQL Server, que espero sea útil para otros que utilicen estas herramientas.

Base de datos Oracle

A lo largo de mis muchos años trabajando con Oracle, asumí que la máscara 'ww' devuelve el número de semana del año de acuerdo con la semana estándar (que se ejecuta de lunes a domingo). Después de hacer algunas consultas, me sorprendió descubrir que los días que pertenecen a la misma semana en realidad pueden tener una Semana No diferente dependiendo del día de la semana en que comenzó el año.

Por ejemplo, la semana 1 de 2010 comenzó un viernes, por lo tanto, cada semana no en 2010 se ejecutará de viernes a jueves:

Después de algunas investigaciones, encontré la siguiente documentación para Oracle DB que proporciona una explicación adicional sobre este tema:

http://download.oracle.com/docs/cd/B10500_01/server.920/a96529/ch7.htm#5186

Al aplicar este nuevo conocimiento a la consulta anterior pude comparar los dos métodos:

Servidor SQL

Para aquellos de ustedes que son programadores de SQL Server, también he investigado un poco sobre este tema. SQL Server 2008 admite la semana ISO como argumento de su función DATEPART. Las versiones anteriores usan la máscara regular 'ww' o 'wk' basada en enero 1. El primer día de una semana se define en la configuración de la sesión DATEFIRST que, de forma predeterminada, establece que el domingo sea el primer día de la semana.

Puede usar esta función definida por el usuario para calcular el número de semana ISO en versiones anteriores de SQL Server 2008 de la siguiente manera:

Después de implementar la función anterior, puede ejecutar la siguiente consulta para comparar la máscara de semana común y la semana ISO:

Observe que el viernes está numerado como el 6 día de la semana. El primer día de una semana depende del parámetro de sesión DATEFIRST, que por defecto está configurado en 7 (las semanas comienzan el domingo y finalizan el sábado).

  • Para ver la configuración actual de DATEFIRST, use la función @@ DATEFIRST.
  • La configuración de SET DATEFIRST se establece en tiempo de ejecución o ejecución y no en tiempo de análisis.
  • Para configurar el lunes como el primer día de la semana, ejecute:

Para finalizar, me gustaría enumerar algunas ventajas y desventajas sobre el uso de la numeración de semana ISO:

Ventajas:

  • Todas las semanas tienen un número integral de días (es decir, no hay semanas parciales).
  • Todos los años tienen un número integral de semanas.
  • La fecha indica directamente el día de la semana.
  • Todas las semanas del año comienzan un lunes y terminan un domingo.
  • Cuando se usa solo sin usar el concepto de mes, todas las semanas en un año son iguales, excepto que algunos años tienen la semana 53 al final.
  • Las semanas son las mismas que se usan con el calendario gregoriano. Las fechas representadas como aaaa-Www-d o aaaaWwwd se pueden clasificar como cadenas.

Desventajas:

  • No todas las partes del mundo tienen una semana laboral que comienza con el lunes. Por ejemplo, en algunos países, la semana laboral puede comenzar el sábado o el domingo.
  • In the link below you can find an extended list of countries and their week numbering rules: http://www.pjh2.de/datetime/weeknumber/wnc.php?l=en
  • Muchas organizaciones usan sus propios calendarios que no siguen el estándar ISO (es decir, calendarios fiscales o calendarios académicos).

En resumen, las cosas no siempre son lo que parecen. Como mis profesores siempre me dijeron, en el negocio de la informática nunca podemos permitirnos hacer suposiciones y siempre debemos leer la documentación y verificar las fuentes.

Me interesaría saber si alguien más tiene información adicional o comentarios para compartir sobre este tema. Por favor, siéntase libre de dejar un comentario más abajo.

EspañolEnglish