Měl jsem podobný problém:Potřeboval jsem vypočítat čísla týdnů na základě následujících pravidel:
- Týden začíná v pátek
- Zbývající dny v roce (všechny dny po posledním pátku v roce, které nedokončí týden) by se měly počítat do prvního týdne příštího roku.
Například:
- 27/12/2012 (čtvrtek) by měl být 52. týden roku 2012
- 28/12/2012 (pátek) by měl být 1. týden roku 2013
- 1. týden 2013 trvá od 28. 12. 2012 do 1. 3. 2013
Učinil jsem toto prohlášení, které vypočítává ROK i ČÍSLO TÝDNE na základě těchto pravidel, která můžete snadno přizpůsobit své situaci:
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));
Záludná část je právě tento výraz:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)
Zbytek (klauzule If) slouží pouze k přizpůsobení výsledku výrazu tak, aby byl rok+1 a týden =1 v 53. týdnu.
Pokusím se ten výraz co nejlépe vysvětlit. Následující výraz vám dá číslo týdne čistě jednoduše (den v roce dělený 7 dny v týdnu zaokrouhlený nahoru):
ceil(( dayofyear(current_date))/7)
Ale teď chcete, aby to začalo v pátek (nebo kterýkoli jiný den). Chcete-li to provést, musíte k aktuálnímu dni přidat dny prvního týdne, které byly součástí předchozího roku (jako by váš aktuální skutečně začal o několik dní dříve, protože váš první týden obsahuje dny z předchozího roku). výraz vypočítá tento posun na základě dne v týdnu 1. ledna:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
Posun je rozdíl mezi 7 a číslem dne v týdnu, kterým má týden začínat:
- 0 na sobotu
- 1 na pátek
- 2 na čtvrtek
- 3 na středu...
Nyní jej tedy stačí přidat k předchozímu, čímž vznikne výše zmíněný výraz, který vypočítá čísla týdnů počínaje kterýmkoli dnem v týdnu a za předpokladu, že týden 1 začíná předchozím rokem:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
Pak jsem jen přidal IF, který změní týden 53 na týden 1, a další pro přidání 1 k roku, pokud je to týden 53.