Ik had een soortgelijk probleem:ik moest weeknummers berekenen op basis van de volgende regels:
- Week begint op vrijdag
- De resterende dagen van een jaar (alle dagen na de laatste vrijdag van het jaar die geen week voltooien) moeten worden geteld in de eerste week van het volgende jaar.
Bijvoorbeeld:
- 27/12/2012 (donderdag) zou week 52 van 2012 moeten zijn
- 28/12/2012 (vrijdag) zou week 1 van 2013 moeten zijn
- Week 1 2013 loopt van 28/12/2012 tot 1/03/2013
Ik heb deze verklaring afgelegd die zowel het JAAR als het WEEKNUMMER berekent op basis van deze regels die u gemakkelijk aan uw omstandigheden kunt aanpassen:
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));
Het lastige is alleen deze uitdrukking:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)
De rest (If-clausules) zijn alleen bedoeld om het resultaat van de uitdrukking aan te passen om jaar+1 en week =1 in week 53 te maken.
Ik zal proberen de uitdrukking zo goed mogelijk uit te leggen. De volgende uitdrukking geeft je het weeknummer puur eenvoudig (de dag van het jaar gedeeld door 7 dagen in een week naar boven afgerond):
ceil(( dayofyear(current_date))/7)
Maar nu wil je het op vrijdag (of een andere dag) laten beginnen. Om dit te doen, moet je bij de huidige dag de dagen van de eerste week toevoegen die deel uitmaakten van het voorgaande jaar (het is alsof je huidige een paar dagen eerder is begonnen, omdat je eerste week dagen van het voorgaande jaar bevat). expressie berekent die verschuiving op basis van de weekdag op 1 januari:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
De offset is het verschil tussen 7 en het weekdagnummer waarop u de week wilt laten beginnen:
- 0 voor zaterdag
- 1 voor vrijdag
- 2 voor donderdag
- 3 voor woensdag...
Dus nu hoef je het alleen maar toe te voegen aan de vorige, wat resulteert in de bovengenoemde uitdrukking die de weeknummers berekent die op een willekeurige weekdag beginnen en ervan uitgaan dat week 1 op het voorgaande jaar begint:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
Vervolgens heb ik zojuist een IF toegevoegd die week 53 verandert in week 1 en een andere om 1 toe te voegen aan het jaar als het week 53 is.