1. 程式人生 > >實現按任意的時間統計資料

實現按任意的時間統計資料

     在進行報表開發的過程中,我們經常會遇到要根據不同的時段進行統計。有的是按年,月,周,日,時,這些都比較容易實現,使用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分鐘統計