Với sự trợ giúp của https://stackoverflow.com/a/45992247/7616138 để tạo một chuỗi trong MySQL, tôi fiddled xung quanh để sản xuất cái này:
Giả sử bảng của bạn được gọi là entries
, truy vấn sau đây tạo ra kết quả mà bạn yêu cầu. Xin lưu ý rằng truy vấn này không hiệu quả lắm vì nó sử dụng kết hợp chéo để tạo chuỗi phút. Nếu khoảng thời gian của bạn lớn hơn, bạn có thể cần phải kéo dài các phép nối chéo.
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
Giải thích:
Mỗi dòng như 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
tạo ra các số từ 0 đến 9. Việc kết hợp chéo một số dòng này với nhau sẽ tạo ra mọi sự kết hợp có thể có của các số này. Chúng tôi sử dụng mỗi dòng để tạo ra một chữ số cụ thể của số phút để thêm vào open_date
(m3 * 1000 + m2 * 100 + m1 * 10 + m0
). Chuỗi số phút này được kết hợp với bảng mục nhập chỉ bằng số phút phù hợp với khoảng thời gian (DATE_ADD(a.open_date, INTERVAL gen_time MINUTE) <= a.close_date
). Trong SELECT
open_date
được làm tròn đến phút (DATE_SUB(a.open_date, INTERVAL SECOND(a.open_date) SECOND)
) và số phút được thêm vào (DATE_ADD(..., INTERVAL gen_time MINUTE)
).
Lược đồ giả định và dữ liệu mẫu:
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");