Mysql
 sql >> Database >  >> RDS >> Mysql

Settimana dell'anno per settimane che iniziano con sabato

Ho avuto un problema simile:dovevo calcolare i numeri delle settimane in base alle seguenti regole:

  • La settimana inizia venerdì
  • I giorni rimanenti di un anno (tutti i giorni dopo l'ultimo venerdì dell'anno che non completano una settimana) devono essere conteggiati nella prima settimana dell'anno successivo.

Ad esempio:

  • 27/12/2012 (giovedì) dovrebbe essere la settimana 52 del 2012
  • 28/12/2012 (venerdì) dovrebbe essere la settimana 1 del 2013
  • La settimana 1 2013 va dal 28/12/2012 al 3/1/2013

Ho fatto questa affermazione che calcola sia l'ANNO che il NUMERO SETTIMANA in base a queste regole che puoi facilmente adattare alle tue circostanze:

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 difficile è proprio questa espressione:

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

Il resto (clausole If) serve solo per adattare il risultato dell'espressione per rendere anno+1 e settimana =1 nella settimana 53.

Cercherò di spiegare l'espressione nel miglior modo possibile. La seguente espressione fornisce il numero della settimana pure simple (il giorno dell'anno diviso per 7 giorni in una settimana arrotondato per eccesso):

ceil(( dayofyear(current_date))/7)

Ma ora vuoi farlo iniziare venerdì (o qualsiasi altro giorno). Per fare ciò devi aggiungere al giorno corrente i giorni della prima settimana che facevano parte dell'anno precedente (è come se la tua corrente fosse iniziata qualche giorno prima, perché la tua prima settimana contiene giorni dell'anno precedente). expression calcola tale offset in base al giorno della settimana del 1° gennaio:

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

L'offset è la differenza tra 7 e il numero del giorno della settimana in cui vuoi che inizi la settimana:

  • 0 per sabato
  • 1 per venerdì
  • 2 per giovedì
  • 3 per mercoledì...

Quindi ora devi solo aggiungerlo a quello precedente ottenendo l'espressione sopra menzionata che calcola i numeri delle settimane a partire da qualsiasi giorno della settimana e supponendo che la settimana 1 inizi l'anno precedente:

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

Quindi ho appena aggiunto un IF che trasforma la settimana 53 nella settimana 1 e un altro per aggiungere 1 all'anno se è la settimana 53.