Mysql
 sql >> Base de données >  >> RDS >> Mysql

Semaine de l'année pour les semaines commençant par le samedi

J'ai eu un problème similaire :j'avais besoin de calculer les numéros de semaine en fonction des règles suivantes :

  • La semaine commence le vendredi
  • Les jours restants d'une année (tous les jours après le dernier vendredi de l'année qui ne complètent pas une semaine) doivent être comptés dans la première semaine de l'année suivante.

Par exemple :

  • 27/12/2012 (jeudi) devrait être la semaine 52 de 2012
  • 28/12/2012 (vendredi) devrait être la semaine 1 de 2013
  • La semaine 1 2013 va du 28/12/2012 au 3/1/2013

J'ai fait cette déclaration qui calcule à la fois l'ANNÉE et le NUMÉRO DE SEMAINE en fonction de ces règles que vous pouvez facilement adapter à votre situation :

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 partie délicate est juste cette expression :

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

Le reste (clauses If) sert juste à adapter le résultat de l'expression pour faire année + 1 et semaine =1 à la semaine 53.

Je vais essayer d'expliquer l'expression du mieux que je peux. L'expression suivante vous donne le numéro de semaine purement simple (le jour de l'année divisé par 7 jours dans une semaine arrondi) :

ceil(( dayofyear(current_date))/7)

Mais maintenant vous voulez le faire commencer le vendredi (ou n'importe quel autre jour). Pour ce faire, vous devez ajouter au jour en cours les jours de la première semaine qui faisaient partie de l'année précédente (c'est comme si votre courant avait commencé quelques jours avant, car votre première semaine contient des jours de l'année précédente). l'expression calcule ce décalage en fonction du jour de la semaine du 1er janvier :

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

Le décalage est la différence entre 7 et le numéro du jour de la semaine auquel vous souhaitez que la semaine commence :

  • 0 pour samedi
  • 1 pour vendredi
  • 2 pour jeudi
  • 3 pour mercredi...

Alors maintenant, il vous suffit de l'ajouter à la précédente, ce qui donne l'expression mentionnée ci-dessus qui calcule les numéros de semaine commençant n'importe quel jour de la semaine et en supposant que la semaine 1 commence l'année précédente :

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

Ensuite, j'ai juste ajouté un IF qui transforme la semaine 53 en semaine 1 et un autre pour ajouter 1 à l'année si c'est la semaine 53.