实现按任意的时间统计数据

     在进行报表开发的过程中,我们经常会遇到要根据不同的时段进行统计。有的是按年,月,周,日,时,这些都比较容易实现,使用to_char函数将日期转换成对应的格式即可。如下所示按日统计。

to_char( h.row_date, 'yyyy-MM-dd' ) AS row_date2

GROUP BY  to_char( h.row_date, 'yyyy-MM-dd' )

只要对数据库表中的时间字段进行处理,to_char( h.row_date, 'yyyy-MM-dd')将其转换成如2018-05-06这种格式,然后按这种格式进行分组,即可实现按天统计。同理可得。

按月 只要将日期处理成to_char( h.row_date, 'yyyy-MM'),在按其分组统计,即可实现按月统计

按年 只要将日期处理成to_char( h.row_date, 'yyyy'),在按其分组统计,即可实现按年统计

按年 只要将时处理成to_char( h.row_date, ''yyyy-MM-dd HH24'),在按其分组统计,即可实现按小时统计

然后如果有的客户会要求比较奇葩,如按15分钟统计一次,30分钟统计一次。还有要求按任意分钟去统计的。

先讲一下按任意分钟统计,首先我们需要将日期类型的时间转换成分钟值。

如2018-09-26 16:15:00时间类型  在postgresql中转换成分钟值是25632495。

若需要按30分钟统计,我们可用上面分钟(25632495)值除以30这样会得到一个数,然后向下取整,由于每个时间除以30分钟得到不同的整数,然后根据相同的整数分组统计,即可实现按任意分钟统计。下面是按15分钟统计sql语句示例

select to_timestamp(times*60*15)::TIMESTAMP as dates,
M1,M5 from(  
SELECT floor((extract(epoch from  h.num1)-8*60*60)/60/15) times ,
sum(case when  h.tkgrp=1 then incalls else 0 end) as M1 ,
sum(case when  h.tkgrp=5 then incalls else 0 end) as M5 
from htkgrp  h where   1=1
group by  floor((extract(epoch from  h.num1)-8*60*60)/60/15)) rs
where 1=1  ORDER BY  to_timestamp(times*60*15) desc

结果集如下

我们以上sql语句进行分析floor((extract(epoch from  h.num1)-8*60*60)/60/15),重点关注这段SQL语句,

extract(epoch from  h.num1) 是时间转换成秒值,但是会存在时区差,减去8小时时间差。然后除以60得到分钟值。

除以15并向下取整得到不同的整数值,按照这些整数值分组统计,便实现按15分钟统计。然后将统计后的时间还原成时间格式to_timestamp(times*60*15)::TIMESTAMP 。

select to_timestamp(times*60*60)::TIMESTAMP as dates,
M1,M5 from(  
SELECT floor((extract(epoch from  h.num1)-8*60*60)/60/60) times ,
sum(case when  h.tkgrp=1 then incalls else 0 end) as M1 ,
sum(case when  h.tkgrp=5 then incalls else 0 end) as M5 
from htkgrp  h where   1=1
group by  floor((extract(epoch from  h.num1)-8*60*60)/60/60)) rs
where 1=1  ORDER BY  to_timestamp(times*60*60) desc

按60分钟统计

 

猜你喜欢

转载自blog.csdn.net/weixin_42324471/article/details/82909272
今日推荐