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");