У меня есть таблица в MySQL, которая документирует время начала и окончания конкретного процесса. Это выглядит так:
process_id process_start process_end data_1 data_2
1 2017-12-05 15:21:55 2017-12-05 15:39:48 SD12891 8952020517397180000
2 2017-12-05 15:40:19 2017-12-05 21:56:10 40001067 8952020017390610000
3 2017-12-05 21:58:10 2017-12-05 22:04:46 SD12667 89014103279450400000
4 2017-12-05 22:05:50 2017-12-05 22:08:11 40001067 89014103279450400000
Я хочу создать представление этого БД с новым столбцом, называемым "process_time", который задокументирует час процесса [LEFT (process_start, 13)], но он создаст строку для каждого часа процесса (вверху) то есть он будет создавать новую строку за каждый час между process_start и process_end), и для каждой новой строки все значения в других столбцах должны оставаться неизменными. Таким образом, БД с последнего снимка будет выглядеть так:
process_id process_time data_1 data_2
1 2017-12-05 15 SD12891 8952020517397180000
2 2017-12-05 15 40001067 8952020017390610000
2 2017-12-05 16 40001067 8952020017390610000
2 2017-12-05 17 40001067 8952020017390610000
2 2017-12-05 18 40001067 8952020017390610000
2 2017-12-05 19 40001067 8952020017390610000
2 2017-12-05 20 40001067 8952020017390610000
2 2017-12-05 21 40001067 8952020017390610000
3 2017-12-05 21 SD12667 89014103279450400000
3 2017-12-05 22 SD12667 89014103279450400000
4 2017-12-05 22 40001067 89014103279450400000
Как это сделать?
Как только у вас есть таблица numbers
, это легко...
https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=0101c14c048f313b69405a77ad62caee
SELECT
rounded.process_id,
rounded.process_start,
rounded.process_end,
TIMESTAMPADD(HOUR, numbers.id, rounded.process_start_hour) AS process_hour,
rounded.data_1,
rounded.data_2
FROM
(
SELECT
*,
DATE_FORMAT(process_start,'%Y-%m-%d %H:00:00') process_start_hour,
DATE_FORMAT(process_end ,'%Y-%m-%d %H:00:00') process_end_hour
FROM
document
)
rounded
INNER JOIN
numbers
ON numbers.id <= EXTRACT(HOUR FROM TIMEDIFF(process_end_hour, process_start_hour))
ORDER BY
rounded.process_id,
numbers.id
Я настоятельно рекомендую таблицу чисел для любого случая, когда вы хотите перевести одну строку в строки строки.