Имах подобен проблем:трябваше да изчисля числата на седмиците въз основа на следните правила:
- Седмицата започва в петък
- Останалите дни от годината (всички дни след последния петък на годината, които не завършват седмица) трябва да се броят през първата седмица на следващата година.
Например:
- 27/12/2012 (четвъртък) трябва да бъде седмица 52 на 2012 г.
- 28/12/2012 (петък) трябва да бъде седмица 1 на 2013 г.
- Седмица 1 2013 г. е от 28/12/2012 до 3/1/2013
Направих това изявление, което изчислява както ГОДИНАТА, така и СЕДМИЦАТА въз основа на тези правила, които можете лесно да адаптирате към вашите обстоятелства:
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));
Трудната част е само този израз:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+1 )/7)
Останалите (клаузи If) са само за адаптиране на резултата от израза, за да направи година+1 и седмица =1 на седмица 53.
Ще се опитам да обясня израза колкото мога по-добре. Следният израз ви дава чисто прост номер на седмицата (денят от годината, разделен на 7 дни в седмицата, закръглен нагоре):
ceil(( dayofyear(current_date))/7)
Но сега искате да го накарате да започне в петък (или всеки друг ден). За да направите това, трябва да добавите към текущия ден дните от първата седмица, които са били част от предходната година (все едно текущата ви всъщност е започнала няколко дни преди това, защото първата ви седмица съдържа дни от предходната година). израз изчислява това изместване въз основа на делничния ден на 1 януари:
dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET
Отместването е разликата между 7 и номера на деня от седмицата, който искате да започне седмицата:
- 0 за събота
- 1 за петък
- 2 за четвъртък
- 3 за сряда...
Така че сега просто трябва да го добавите към предишния, което води до гореспоменатия израз, който изчислява номерата на седмиците, започващи всеки делничен ден и приемайки, че седмица 1 започва от предходната година:
ceil(( dayofyear(current_date) + dayofweek(date_format(current_date, '%Y-01-01'))+OFFSET )/7)
Тогава просто добавих IF, който превръща седмица 53 в седмица 1 и друг, за да добавя 1 към годината, ако е седмица 53.