Oracle按年、月、日、周等統計數據

在不少項目中都會有數據統計的功能,如按照年、月、周、日統計某個用戶提交的數量;或者直接統計指定年、月、周或者日新增的數量。最近我接觸的一個項目,客戶就要求根據月和周統計每一個單位提價提交的數量。sql

按年統計

select 
  o.id,
  o.name,
  to_char(a.create_date,'yyyy'),
  count(*)
from news a
left join sys_user u on u.id = a.create_by 
left join sys_office o on o.id = u.office_id
group by o.id,o.name,to_char(a.create_date,'yyyy')

這裏就是將建立時間格式化爲年形式,按照單位id分組,查詢出提交的數量。數據庫

按月統計

這裏直接將上面的的日期格式改成yyyy-MM形式便可。oracle

select 
  o.id,
  o.name,
  to_char(a.create_date,'yyyy-MM'),
  count(*)
from news a
left join sys_user u on u.id = a.create_by 
left join sys_office o on o.id = u.office_id
group by o.id,o.name,to_char(a.create_date,'yyyy-MM')

按周統計

按周統計能夠顯示兩種效果,一種是顯示出該日期的週一的日期,也就是天然周的日期,另一種是按周天然周統計。函數

按天然周統計

select 
  o.id,
  o.name,
  to_char(a.create_date,'ww'),
  count(*)
from t_dzjg_news a
left join sys_user u on u.id = a.create_by 
left join sys_office o on o.id = u.office_id
group by o.id,o.name,to_char(a.create_date,'ww')

這裏的ww是獲取該日期的在年中的第幾周。spa

按天然周的日期統計

這裏處理起來能夠會比較繁瑣,首先要獲取日期的所在周的週一的日期,而後根據週一日期分組查詢:.net

---獲取指定日期的週一的日期
select trunc(sysdate,'ww') from dual;

select to_char(trunc(sysdate,'ww'),'yyyy-MM-dd') from dual;

---將建立時間格式爲週一的形式,再去查找
select 
  o.id,
  to_char(trunc(a.create_date,'ww'),'yyyy-MM-dd') AS 週一,
  count(*)
from t_dzjg_news a
left join sys_user u on u.id = a.create_by 
left join sys_office o on o.id = u.office_id
group by o.id,to_char(trunc(a.create_date,'ww'),'yyyy-MM-dd')

這裏使用到一個函數trunc():該函數相似截取函數,按指定的格式截取輸入的數據。這裏將時間截取爲顯示周的形式。code

按季度統計

在oracle中q爲時間的季度如:blog

select to_char(sysdate,'q') from dual;--取得當前時間的季度

因此上面的sql能夠改成:rem

select 
  o.id,
  to_char(a.create_date,'q') AS 季度,
  count(*)
from t_dzjg_news a
left join sys_user u on u.id = a.create_by 
left join sys_office o on o.id = u.office_id
group by o.id, to_char(a.create_date,'q')

按天統計

這個就幾乎沒啥好說的了:get

select 
  o.id,
  to_char(a.create_date,'yyyy-MM-dd') AS 日期,
  count(*)
from t_dzjg_news a
left join sys_user u on u.id = a.create_by 
left join sys_office o on o.id = u.office_id
group by o.id, to_char(a.create_date,'yyyy-MM-dd')

總結

對於數據庫數據的統計,這些還只是很簡單基礎。這幾天經過寫那些統計功能,雖然寫的頭大,可是對數據庫知識愈來愈深。對於寫複雜的sql語句,要細分問題,一步步的查詢,最後將一步步分析的簡單的查詢組合成想要的複雜查詢,能夠說是從小到大,切忌從大到小。

最後

關於Oracle數據庫中對時間經常使用的操做能夠查看我以前的一篇博客:

Oeacle常見的日期處理

相關文章
相關標籤/搜索