Въведете период от време на mysql, добавете различна стойност на всеки 7 дни (календар на работни смени)

Опитвам се да направя календар на работни смени, при който служител може да работи 30 часа в една седмица, но 40 в друга.

Всеки служител може да има няколко различни седмици, всяка от които може да има различни работни дни, часове.

Ако служител например има 2 различни работни седмици, в календара това трябва да изглежда по следния начин:

 1 | 01-01-2015 | week1 | employee1
 2 | 01-02-2015 | week1 | employee1
 3 | 01-03-2015 | week1 | employee1
 4 | 01-04-2015 | week1 | employee1
 5 | 01-05-2015 | week1 | employee1
 6 | 01-08-2015 | week2 | employee1
 7 | 01-09-2015 | week2 | employee1
 8 | 01-10-2015 | week2 | employee1

Как бих попълнил календарна таблица с диапазон от дати, добавяйки различен week_id на всеки 7 дни според данни от друга таблица?

**Calendar table columns:**

- id
- date
- week_id
- employee_id

**Employee table columns:**

- id
- day_id
- employee_id
- week_id
- work_hours_from
- work_hours_to

Примерни данни за таблицата на служителите:

данни за таблица

Опитах следното, което се доближава, но всички дати са една и съща дата, което води до безкраен цикъл:

DROP PROCEDURE IF EXISTS filldates;
CREATE PROCEDURE filldates(dateStart DATE, dateEnd DATE)
BEGIN

  WHILE dateStart <= dateEnd DO
    INSERT INTO prefix_calendar (date,week_id,employee_id)
    SELECT date_add(dateStart, INTERVAL 1 DAY),week_id,employee_id FROM prefix_employee_hours WHERE employee_id = 5;
  END WHILE;
END;

CALL filldates('2011-05-01','2011-05-05');

person ElFietsbel    schedule 26.12.2015    source източник


Отговори (1)


Не знам дали логиката е правилна в цикъла, но трябва да увеличите dateStart, ако искате да прекрати:

Така че добавете:

set dateStart = date_add(dateStart, INTERVAL 1 DAY);

точно преди END WHILE.

person Gordon Linoff    schedule 26.12.2015
comment
Благодарение на вашия отговор виждам, че като забравите да зададете интервала dateStart, той продължава да се зацикля, тъй като към първоначалната начална дата не се добавят дни. Вашето решение ме доближава още повече до това, от което имам нужда, с изключение на това, че сега добавя двойни дати за всеки week_id (7x 2011-05-01 за седмица1 и 7x 2011-05-01 за седмица2), където вместо това търся да получа това: 7x 2011-05-01 за седмица 1, 7x 2011-05-02 за седмица 2, 7x 2011-05-03 за седмица 1, 7x 2011-05-04 за седмица 2 и т.н. - person ElFietsbel; 26.12.2015