轉載自:http://blog.csdn.net/jie11447416/article/details/50887888java
一、案例中的數據結構和數據以下spring
二、在沒有解決的時候,是這樣的sql
1 SELECT date(downtime) AS dday, count(*) AS num FROM re_device GROUP BY dday 數據結構
獲得以下結果,若是那天沒有數據,那麼就會沒有記錄 mvc
咱們看到,時間不連續,沒有2016-3-05這一天的,這樣原本不是問題,可是,我拿出來的數據,還要畫出圖表呀,沒有固然不行,咱們須要的是下面這個樣子的。 spa
簡單的說就是,沒有數據,就要補充一個0..net
三、下面咱們講實現code
咱們要生成一個日曆的表,而後和原來的數據,聯合查詢,說到這裏,你們就知道很low了,可是,限於我水平有限,研究這個問題,半天,這個是我找到的比較好的一種實現方式。若是你又更好的,也請你給我說下。
執行下面的sql,直接誒生成日曆的表(calendar)對象
CREATE TABLE num (i int);-- 建立一個表用來儲存0-9的數字 INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);-- 生成0-9的數字,方便之後計算時間 CREATE TABLE if not exists calendar(datelist date); -- 生成一個存儲日期的表,datalist是字段名 -- 這裏是生成並插入日期數據 INSERT INTO calendar(datelist) SELECT adddate( ( -- 這裏的起始日期,你能夠換成當前日期 DATE_FORMAT("2016-1-1", '%Y-%m-%d') ), numlist.id ) AS `date` FROM ( SELECT n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000+ n10000.i * 10000 AS id FROM num n1 CROSS JOIN num AS n10 CROSS JOIN num AS n100 CROSS JOIN num AS n1000 CROSS JOIN num AS n10000 ) AS numlist;
這裏我用了100000條記錄,算出來到2289年了,徹底夠用了,到那個時候,出問題,我也管不了了。blog
完成以後,請刪除num的零時表
四、聯合查詢
1 SELECT 2 date(dday) ddate, 3 count(*) - 1 as num 4 FROM 5 ( 6 SELECT 7 datelist as dday 8 FROM 9 calendar 10 -- 這裏是限制返回最近30天的數據 11 where DATE_SUB(CURDATE(), INTERVAL 30 DAY) <= date(datelist)&&date(datelist)<=CURDATE() 12 UNION ALL 13 SELECT 14 downtime 15 FROM 16 re_device 17 ) a 18 GROUP BY ddate
五、其餘解決方法
固然,應該還有其餘的解決方案,可是博主就沒有去寫了,有時間能夠去寫一下。
我用的spring mvc,因此,也仍是能夠在java代碼中補充完整的,由於數據返回的是個map對象,那麼咱們要遍歷這個對象,直接用calendar對象,生成日期做爲key來遍歷,若是沒有數據,就put進去一個0,而後在限制一下,須要多少天的,就能夠了。數據就完整了。
可是這樣也有一個問題,那就是map裏的數據順序會有問題,因此,使用的時候,也必須是生成calendar對象,而後構造出來日期做爲key來遍歷。或者用Collections.sort()排序一下。
我我的以爲,仍是上數據直接生成得比較好一點。