如何使用生成器表在MySQL中生成5分钟的时间间隔

时间:2015-04-13 17:29:17

标签: mysql intervals

我有这些生成器视图:

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意大利面条代码接近了预期的结果,并且认为必须有一种更清洁的方式,我才完全失踪。

我对“INTERVAL n”如何工作的理解似乎是这里的问题。请帮忙

1 个答案:

答案 0 :(得分:0)

我找到了办法。如果你能看到更干净的方式,请告诉我。虽然我认为这并不是那么糟糕,但我希望没有额外的交叉连接我能做到。

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