Mysql
 sql >> база данни >  >> RDS >> Mysql

Седмица от годината за седмици, започващи от събота

Имах подобен проблем:трябваше да изчисля числата на седмиците въз основа на следните правила:

  • Седмицата започва в петък
  • Останалите дни от годината (всички дни след последния петък на годината, които не завършват седмица) трябва да се броят през първата седмица на следващата година.

Например:

  • 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.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Класически ASP + Motobit Pure ASP Качване + UTF-8 Charset

  2. MySQL 5.0 индекси – уникални срещу неуникални

  3. MySql получава списък с уникални думи от таблица, където стойностите в поле са разделени със запетая

  4. MySQL:Как да копирам редове, но да променям няколко полета?

  5. Заявка за обобщена таблица на MySQL с динамични колони