С помощта на https://stackoverflow.com/a/45992247/7616138 за генериране на поредица в MySQL побърках наоколо, за да произведе това:
Ако приемем, че вашата таблица се нарича entries
, следната заявка дава резултата, който поискахте. Моля, имайте предвид, че тази заявка не е много ефективна, тъй като използва кръстосани съединения за изграждане на поредица от минути. Ако вашите интервали са по-големи, може да се наложи да удължите кръстосаните съединения.
SELECT
a.*,
DATE_ADD(DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND), INTERVAL gen_time MINUTE) AS gen_date_time
FROM
entries AS a
LEFT JOIN
(
SELECT
m3 * 1000 + m2 * 100 + m1 * 10 + m0 AS gen_time
FROM
(SELECT 0 m0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m0,
(SELECT 0 m1 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m1,
(SELECT 0 m2 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m2,
(SELECT 0 m3 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9) AS m3
ORDER BY
gen_time asc
) AS b ON (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date)
ORDER BY
a.id,
gen_date_time
Обяснение:
Всеки ред като SELECT 0 m0 UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4 UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
произвежда числата от 0 до 9. Кръстосаното свързване на няколко от тези линии заедно дава всяка възможна комбинация от тези числа. Използваме всеки ред, за да създадем конкретна цифра от броя минути, които да добавим към open_date
(m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Тази поредица от минути се присъединява към таблицата със записи, като се използват само толкова минути, колкото се побират в интервала (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). В полето SELECT
open_date
се закръгля до минута (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
) и броят минути се добавя (DATE_ADD(..., INTERVAL gen_time MINUTE)
).
Предполагаема схема и примерни данни:
CREATE TABLE entries (
id INT AUTO_INCREMENT PRIMARY KEY,
open_date TIMESTAMP,
close_date TIMESTAMP
);
INSERT INTO entries (open_date, close_date) VALUES
("2019-07-03 16:28:39.497", "2019-07-04 16:28:39.497"),
("2019-07-04 15:28:39.497", "2019-07-05 19:28:39.497");