1. 程式人生 > >MySQL中實現連續日期內資料統計,預設天數0補全

MySQL中實現連續日期內資料統計,預設天數0補全

昨天群裡有同學在問:想要查詢當前日期到前7天時間內,每天的資料量總和是多少?

這個相信很多人都可以想到直接用group by data就可以實現,但是這裡有一個關鍵,現在需要把這七天內缺少的幾天資料統計出來,因為本人也是剛工作半年多的時間,對SQL也並不是瞭解的特別多,上網查了一下相關問題的資料,可能是查詢的不正確,或者看的不全面,網上多數部落格回答的都有那麼一些問題,所以自己就新建了一個用來進行測試的資料庫來進行實際操作。

轉入正題:下面是全過程,最後實現是在最後一步,如果只需要看到結果,可以略過前面步驟

(一):在MySQL資料庫中建了一張名為test的表表很簡單,只有4個欄位(除了createTime 其餘均為varchar型別的欄位)
按照我們的思路,首先想到的應該是如何查詢當前時間到七天前的資料?是在後臺對時間進行處理,然後傳到SQL中使用between date1 and date2這種方式麼?會不會有更好的辦法?
在這裡MySQL其實還有一種更便捷的方法來快速取到當前日期到前七天的日期,這裡我們使用的是表test,一下文章出現的表均為此表。
語法:
select day(createTIme) date,count(*) count from test where DATE_SUB(now(), interval 7 DAY) <= createTime group by DATE_FORMAT(createTime, '%Y-%m-%d')


這裡解釋一下,DATE_SUB(date,INTERVAL expr type)函式:從日期減去指定的時間間隔,date 引數是合法的日期表示式。expr 引數是您希望新增的時間間隔,type是時間型別,這裡可以有day,month,year等等,還有很多其他引數,如有需要可以看一下MySQL的官方文件。
可以通過下面這個連結快速檢視

這裡是查詢結果:都是應用test表進行的查詢

通過查詢結果我們可以看到,當前日期是(2017-12-21),按照我們的想法,查詢出來的資料應該是21,20,19,18,17,16,15這七天的資料才對,但是看一下test表,從21到15這七天中,有兩天(16和17)並沒有資料,但是實際中,我們繪製折線圖等等的時候,就算沒有資料,這兩天我們也需要顯示成0,顯然這不符合我們的實際需求。這是我們會想,可以在後端拿到資料後進行迴圈判斷,查找出是哪幾天缺少了,然後進行賦值,但是利用迴圈時,會降低效率,那麼有沒有更好的實現方式呢?

(二):使用union關鍵字進行連線查詢
直接上程式碼及查詢結果:
結果如圖
我們看到,使用union進行連線查詢之後,顯示出的結果16和17號兩天已經補上了資料0,但是這個時候我們會提出一個疑問,16和17號我們是在看到第一次的查詢結果之後,才知道這兩天的資料缺失了,在不知道的情況下怎麼辦呢?在這種情況下,我們第一時間想到的可能是,在後端獲取到日期,然後把日期當成引數傳遞到SQL中,但是這樣做會拼接出很多的union,會使SQL變的很長,而且當資料量大的時候怎麼辦呢?效率會不會很低?接下來我們來解決這個問題。

(三):使用union all關鍵字進行連線查詢
為了解決拼接時間帶來的麻煩,這裡我們就可以藉助一張臨時日期表,我們可以在這個日期表中使用SQL指令碼產生XXXX年-YYYY年的日期,下面是臨時表,在這裡因為是測試,我只錄入了幾條資料。
temp_table


表裡只有兩個欄位,xxx任意欄位,date日期。
下面我們來看一下使用union all之後的查詢結果:

我們看到,想要的結果出來啦!到此為止,我們算是實現了連續日期內查詢的功能,或許還有更好的方法來實現,只是目前為止我沒有想到,有更好辦法的可以一起交流一下。
對於union和union all在這裡就不做解釋了,有疑問的可以去找偉大的度娘進行查詢。