在面对大数据量定期别统计时,数据库表中每每只有一个日期列,若是在统计时直接使用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。