在面對大數據量定期別統計時,數據庫表中每每只有一個日期列,若是在統計時直接使用to_char函數轉換成期別進行group by會致使SQL執行較慢,由於to_char後用不上索引,而大部分時候咱們只創建一個函數索引to_char(r.finish_time, 'yyyy-mm-dd')。如下爲各期別的to_char格式:數據庫
1)、按天統計,to_char(r.finish_time, 'yyyy-mm-dd');函數
2)、按月統計,to_char(r.finish_time, 'yyyy-mm');大數據
3)、按年統計,to_char(r.finish_time, 'yyyy');spa
4)、按季統計,to_char(r.finish_time, 'yyyy-"Q"q');.net
5)、按周統計,to_char(r.finish_time, 'yyyy-iw');blog
若是時間範圍不是日期範圍,需將各統計方式時間段轉換爲日期時間段做爲條件,便於使用索引to_char(r.finish_time, 'yyyy-mm-dd'),先過濾有效記錄再分組統計。索引
1)、按天統計,不需再處理;get
2)、按月統計,開始時間+"-01",結束時間加+"-31";程序
3)、按年統計,開始時間+"-01-01",結束時間加+"-12-31";方法
4)、按季統計和按周統計,根據開始時間和結束時間計算最小日期和最大日期。
問題一
按周統計不能夠直接使用'yyyy-iw',周跨年時會出現如2013-12-31爲2013-01,2014-01-01爲2014-01,格式中的yyyy表示的是實際年份,2013-12-31和2014-01-01在同一周,若是直接group by將致使多出一個分組。
問題二
期間內若是有期別無記錄將致使展示結果不連續,好比圖中缺乏一個點,須要程序再特殊處理。
解決方法是預先備好一張日期與各期別對照表,參考http://my.oschina.net/h2do/blog/268154。