Jeg havde et lignende problem:Jeg var nødt til at beregne ugenumre baseret på følgende regler:
- Ugen starter på fredag
- De resterende dage af et år (alle dage efter den sidste fredag i året, som ikke afslutter en uge) skal tælles med i den første uge i det næste år.
For eksempel:
- 27/12/2012 (torsdag) skulle være uge 52 i 2012
- 28/12/2012 (fredag) skulle være uge 1 i 2013
- Uge 1 2013 går fra 28/12/2012 til 3/1/2013
Jeg lavede denne erklæring, der beregner både ÅR og UGENUMMER baseret på disse regler, som du nemt kan tilpasse til din 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));
Den vanskelige del er netop dette udtryk:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)
Resten (If-sætninger) er kun til at tilpasse resultatet af udtrykket til år+1 og uge =1 i uge 53.
Jeg vil prøve at forklare udtrykket så godt jeg kan. Følgende udtryk giver dig ugenummeret rent simpelt (dagen i året divideret med 7 dage i en uge rundet op):
ceil(( dayofyear(current_date))/7)
Men nu vil du få det til at starte på fredag (eller en hvilken som helst anden dag). For at gøre dette skal du tilføje til den aktuelle dag, de dage i den første uge, der var en del af det foregående år (det er som om din nuværende faktisk startede et par dage før, fordi din første uge indeholder dage fra det foregående år). udtryk beregner denne forskydning baseret på ugedagen den 1. januar:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
Forskydningen er forskellen mellem 7 og det ugedagnummer, du ønsker, at ugen skal starte:
- 0 for lørdag
- 1 til fredag
- 2 til torsdag
- 3 til onsdag...
Så nu skal du bare tilføje det til det forrige, hvilket resulterer i det ovennævnte udtryk, der beregner ugenumrene, der starter på en hvilken som helst ugedag og antager, at uge 1 starter på det foregående år:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
Så har jeg lige tilføjet en HVIS, der gør uge 53 til uge 1 og en anden for at tilføje 1 til året, hvis det er uge 53.