Как создать 5-минутные интервалы в MySQL, используя таблицу генератора
У меня есть эти виды генератора:
CREATE OR REPLACE VIEW generator_16
AS SELECT 0 n UNION ALL SELECT 1 UNION ALL SELECT 2 UNION ALL
SELECT 3 UNION ALL SELECT 4 UNION ALL SELECT 5 UNION ALL
SELECT 6 UNION ALL SELECT 7 UNION ALL SELECT 8 UNION ALL
SELECT 9 UNION ALL SELECT 10 UNION ALL SELECT 11 UNION ALL
SELECT 12 UNION ALL SELECT 13 UNION ALL SELECT 14 UNION ALL
SELECT 15;
CREATE OR REPLACE VIEW generator_256
AS SELECT ( ( hi.n << 4 ) | lo.n ) AS n
FROM generator_16 lo, generator_16 hi;
И тогда у меня есть этот простой код, который генерирует
SELECT DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:00') - INTERVAL n minute cardinal_interval
FROM generator_256
WHERE DATE_FORMAT(NOW(), '%Y-%m-%d %H:%i:00') - INTERVAL n minute >= NOW() - INTERVAL 1 hour
Если текущее время 2015-04-13 13:17:32
Это генерирует
2015-04-13 13:17:00
2015-04-13 13:16:00
2015-04-13 13:15:00
2015-04-13 13:14:00
2015-04-13 13:13:00
2015-04-13 13:12:00
2015-04-13 13:11:00
2015-04-13 13:10:00
2015-04-13 13:09:00
...
2015-04-13 12:18:00
2015-04-13 12:17:00
Все идет нормально. Я просто хочу знать, как заставить его использовать ту же таблицу генератора, но дать мне округленные 5-минутные интервалы, чтобы результат был
Если текущее время 2015-04-13 13:17:32:
2015-04-13 13:15:00
2015-04-13 13:10:00
2015-04-13 13:05:00
2015-04-13 13:00:00
2015-04-13 12:55:00
...
2015-04-13 12:15:00
Я был в этой проблеме в течение нескольких часов. Я приблизился к желаемому результату, используя какой-то ужасный код спагетти mysql, и просто подумал, что должен быть гораздо более чистый способ, который я просто полностью упускаю.
Мое понимание того, как работает "ИНТЕРВАЛ п", кажется, проблема здесь. Пожалуйста помоги
1 ответ
Ну, я нашел способ сделать это. Пожалуйста, дайте мне знать, если вы видите более чистый путь, хотя. Думаю, это не так уж и плохо, но я бы хотел сделать это без дополнительного перекрестного соединения.
SELECT
DATE_ADD(@start_date, INTERVAL @i:=@i-5 MINUTE) AS result_date
FROM
generator_256
CROSS JOIN
(SELECT @i:=5, @start_date:=FROM_UNIXTIME( TRUNCATE(UNIX_TIMESTAMP(NOW()) / 300,0) * 300)) AS init
WHERE
DATE_ADD(@start_date, INTERVAL @i MINUTE) > NOW() - INTERVAL 60 minute