在不少項目中都會有數據統計的功能,如按照年、月、周、日統計某個用戶提交的數量;或者直接統計指定年、月、周或者日新增的數量。最近我接觸的一個項目,客戶就要求根據月和周統計每一個單位提價提交的數量。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數據庫中對時間經常使用的操做能夠查看我以前的一篇博客: