Как создать 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
Другие вопросы по тегам