У меня есть таблица со следующими данными и структурой:
Date Analyst Start Time Stop Time
4/2/2018 Bill Smith 7:00 10:00
Мне нужно увеличить время начала и время остановки, чтобы быть разбитым на 30-минутные интервалы. Итоговый стол должен выглядеть следующим образом:
Date Analyst Start Time Stop Time
4/2/2018 Bill Smith 7:00 7:30
4/2/2018 Bill Smith 7:30 8:00
4/2/2018 Bill Smith 8:00 8:30
4/2/2018 Bill Smith 8:30 9:00
4/2/2018 Bill Smith 9:00 9:30
4/2/2018 Bill Smith 9:30 10:00
Есть ли способ, которым я могу достичь этого, используя MySQL в запросе?
Поскольку один из комментариев предполагает, что это довольно широкая тема, однако по-прежнему можно настроить вас на путь выполнения этой задачи, поскольку вы говорите так, будто у вас есть проблема.
Разбейте его на этапы.
Во-первых, вам понадобится таблица для работы с (tableB), которая позволит вам записывать вновь созданные записи временных интервалов. Это должно соответствовать схеме существующей таблицы (tableA). Это проще и безопаснее писать во вторую таблицу, чем сложнее, со смесью обновлений и вставок, если вы пытаетесь работать только с существующей таблицей.
Во-вторых, определите процедуру. Основная структура примерного курсора в документации идеально подходит для ваших потребностей, как только вы вычеркиваете все ссылки на cur2 и IF b < c THEN... END IF;
блок.
Вы должны следовать точной структуре примера и начинать с объявления переменных для каждого из столбцов в таблице. Объявление для cur1 должно выбрать все столбцы из таблицы A. Вам нужно обработать строки, возвращаемые курсором в LOOP, как в примере, но для этого вам нужно определить блок WHILE... END WHILE. Если вы вызвали переменные vDate, vAnalyst, vStartTime и vStopTime, тогда блок WHILE выглядел бы примерно так:
WHILE vStartTime < vStopTime DO
INSERT INTO tableB ('date','analyst','startTime','stopTime')
VALUES (vDate,vAnalyst,vStartTime, ADDTIME(vStartTime, '00:30:00'));
SET vStartTime := ADDTIME(vStartTime, '00:30:00');
END WHILE;
ВЫЗЫВАЙТЕ процедуру, и вы должны заполнить таблицуB необходимыми записями временных интервалов.
Наконец, когда вы довольны определением и записями в tableB, отмените таблицу A и переименуйте tableB в tableA.
Я сделал эту хранимую процедуру для вас, единственное, что вы можете улучшить, - это объединить все результаты в один (если это возможно).
CREATE PROCEDURE test()
BEGIN
DECLARE vFecIni DATETIME;
DECLARE vFecFin DATETIME;
SET vFecIni = CONCAT(DATE(NOW()),' ', '00:00:00');
SET vFecFin = CONCAT(DATE(NOW()),' ', '00:00:00') + INTERVAL 1 DAY;
WHILE vFecIni < vFecFin DO
SELECT vFecIni;
SET vFecIni = vFecIni + INTERVAL 30 MINUTE;
END WHILE;
END;