我对此有所尝试,我真的很想看看其他人将如何解决它。
我之前遇到过类似的问题,并通过创建时间索引表然后根据重写时间加入数据表以适应时间范围来解决它。问题是您需要一个新的时间索引表和每个时间间隔的单独查询或视图。
以这种方式加入数据的好处是我还对没有读数或结果的时间范围感兴趣,因此我需要查看某些时间范围内的空值或没有读数。最终数据只需要一点额外的工作(即:取出占位符)。
我做的第一件事是创建一个时间索引表,它看起来像这样......
mysql> select * from ctb_time_idx WHERE YEAR( ctb_datetime ) = 2013 LIMIT 10 ;
+---------------------+
| ctb_datetime |
+---------------------+
| 2013-01-01 00:00:00 |
| 2013-01-01 00:15:00 |
| 2013-01-01 00:30:00 |
| 2013-01-01 00:45:00 |
| 2013-01-01 01:00:00 |
| 2013-01-01 01:15:00 |
| 2013-01-01 01:30:00 |
| 2013-01-01 01:45:00 |
| 2013-01-01 02:00:00 |
| 2013-01-01 02:15:00 |
+---------------------+
10 rows in set (0.07 sec)
然后我将我的数据合并到
( select
ctb_datetime AS time1 ,
'Placeholder' AS TimeInterval ,
NULL AS `Col A` ,
NULL AS `Col B`
from my_time_idx
where YEAR ( ctb_time_idx.ctb_datetime ) = 2013 )
UNION
( select DATE_FORMAT( time1 , '%Y-%m-%d %H:00' ) AS time1 ,
'00min' AS TimeInterval , `Col A` , `Col B` from my_data_table
where MINUTE( time1 ) BETWEEN 00 AND 14 )
UNION
( select DATE_FORMAT( time1 , '%Y-%m-%d %H:15' ) AS time1 ,
'15min' AS TimeInterval, `Col A` , `Col B` from my_data_table
where MINUTE( time1 ) BETWEEN 15 AND 29 )
UNION
( select DATE_FORMAT( time1 , '%Y-%m-%d %H:30' ) AS time1 ,
'30min' AS TimeInterval, `Col A` , `Col B` from my_data_table
where MINUTE( time1 ) BETWEEN 30 AND 44 )
UNION
( select DATE_FORMAT( time1 , '%Y-%m-%d %H:45' ) AS time1 ,
'45min' AS TimeInterval, `Col A` , `Col B` from my_data_table
where MINUTE( time1 ) BETWEEN 45 AND 59 )
order by time1
我在我的旧表上测试了它,它似乎工作正常,我不得不重新编辑我的代码以适应你的例子,所以希望我这样做时没有搞砸。