sql >> Base de Datos >  >> RDS >> Mysql

Semana del año para semanas que comienzan con el sábado

Tuve un problema similar:necesitaba calcular los números de semana según las siguientes reglas:

  • La semana comienza el viernes
  • Los días restantes de un año (todos los días posteriores al último viernes del año que no completan una semana) deben contarse en la primera semana del año siguiente.

Por ejemplo:

  • 27/12/2012 (jueves) debería ser la semana 52 de 2012
  • 28/12/2012 (viernes) debería ser la semana 1 de 2013
  • La semana 1 de 2013 va del 28/12/2012 al 3/1/2013

Hice esta declaración que calcula tanto el AÑO como el NÚMERO DE LA SEMANA en base a estas reglas que puedes adaptar fácilmente a tu circunstancia:

SELECT IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, YEAR(current_date)+1, YEAR(current_date)), 
        IF(ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7) > 52, 1, ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7));

La parte complicada es solo esta expresión:

ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)

El resto (cláusulas If) son solo para adaptar el resultado de la expresión para hacer año+1 y semana =1 en la semana 53.

Intentaré explicar la expresión lo mejor que pueda. La siguiente expresión le da el número de la semana pura y simple (el día del año dividido por 7 días en una semana redondeado):

ceil(( dayofyear(current_date))/7)

Pero ahora quieres que empiece el viernes (o cualquier otro día). Para hacer esto, debe agregar al día actual los días de la primera semana que formaron parte del año anterior (es como si su día actual comenzara unos días antes, porque su primera semana contiene días del año anterior). Esto expresión calcula esa compensación en función del día de la semana el 1 de enero:

dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET

El desplazamiento es la diferencia entre 7 y el número del día de la semana en el que desea que comience la semana:

  • 0 para el sábado
  • 1 para el viernes
  • 2 para el jueves
  • 3 para el miércoles...

Entonces, ahora solo tiene que agregarlo al anterior, lo que da como resultado la expresión mencionada anteriormente que calcula los números de semana que comienzan en cualquier día de la semana y asume que la semana 1 comienza el año anterior:

ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)

Luego agregué un IF que convierte la semana 53 en la semana 1 y otro para agregar 1 al año si es la semana 53.