Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Semana do ano por semanas começando com sábado


Eu tive um problema semelhante:eu precisava calcular os números das semanas com base nas seguintes regras:
  • A semana começa na sexta-feira
  • Os dias restantes de um ano (todos os dias após a última sexta-feira do ano que não completam uma semana) devem ser contados na primeira semana do ano seguinte.

Por exemplo:
  • 27/12/2012 (quinta-feira) deve ser a semana 52 de 2012
  • 28/12/2012 (sexta-feira) deve ser a semana 1 de 2013
  • A semana 1 de 2013 vai de 28/12/2012 a 01/03/2013

Fiz esta declaração que calcula tanto o ANO quanto o NÚMERO DA SEMANA com base nestas regras que você pode facilmente adaptar à sua circunstância:
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));

A parte complicada é apenas esta expressão:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)

O resto (cláusulas If) são apenas para adaptar o resultado da expressão para fazer ano+1 e semana =1 na semana 53.

Vou tentar explicar a expressão da melhor forma possível. A expressão a seguir fornece o número da semana de forma simples (o dia do ano dividido por 7 dias em uma semana arredondado):
ceil(( dayofyear(current_date))/7)

Mas agora você quer começar na sexta-feira (ou em qualquer outro dia). Para fazer isso, você precisa adicionar ao dia atual, os dias da primeira semana que fizeram parte do ano anterior (é como se o seu atual realmente tivesse começado alguns dias antes, porque sua primeira semana contém dias do ano anterior). expressão calcula esse deslocamento com base no dia da semana em 1º de janeiro:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET

O deslocamento é a diferença entre 7 e o número do dia da semana que você deseja que a semana comece:
  • 0 para sábado
  • 1 para sexta-feira
  • 2 para quinta-feira
  • 3 para quarta-feira...

Então agora você só precisa adicioná-lo ao anterior, resultando na expressão mencionada acima que calcula os números da semana começando em qualquer dia da semana e assumindo que a semana 1 comece no ano anterior:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)

Então eu apenas adicionei um IF que transforma a semana 53 na semana 1 e outro para adicionar 1 ao ano se for a semana 53.