Вставьте диапазон дат 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 для week1 и 7x 2011-05-01 для week2), где вместо этого я пытаюсь получить это: 7x 01.05.2011 для недели 1, 7x 02.05.2011 для недели 2, 7x 03.05.2011 для недели 1, 7x 04.05.2011 для недели 2 и т. д. и т. д. - person ElFietsbel; 26.12.2015