以天爲統計週期,是常見需求。週報、月報更是常見需求。長週期項目,甚至有年報需求。我已經掌握了mysql
中按天統計,如何實現按年、按月、按周統計呢?html
實現以天爲統計週期很簡單。具體來講,date()
函數可返回時間數據的日期,即僅有年月日,沒有時分秒信息。結合 group by
可實現按天統計。mysql
以天爲統計週期的數據指標很是多,隨便舉例,好比每日新增註冊用戶數。sql
select
date(created_at) as 註冊日期,
count(user_id) as 用戶數
from
users
group by
註冊日期
order by
註冊日期
複製代碼
既然date()
函數可用,那麼是否有對應的 year
、month
、week
等函數可用呢?這純屬個人推理,那試試看吧。數據庫
果真可行。但美中不足的是,返回的週數和月數不帶年份。當數據量跨年時,它會把每一年相同週數或月數的數據加在一塊兒。如何實現某年某月
和某年某周
呢?已有知識儲備去推理,沒找到答案,那就直接搜索吧!編程
通過搜索和嘗試發現,在mysql中用date_format(column_name,'%Y-%m')
來代替month()
就能拿到年月
值。函數
若是把其中表明月month的關鍵字m
換成周week呢?試試看。分別嘗試: date_format(column_name,'%Y-%w')
和 date_format(column_name,'%Y-%W')
。 學習
數據返回結果不對呀?並非預期的今年第幾周。小寫的w
返回的是本週第幾天,大寫的W
返回的是周幾的英文名。如何拿到今年第幾周
這個值,實現週報的統計週期呢?網站
我自學編程時,很喜歡從已知去推理,拓展本身的技能。一般推理能帶來驚喜,當推理不夠用時,那就搜索大法好。搜索特定問題的答案時,一般也能發現某塊知識不足。好比我這裏我就意識到本身不熟悉表達日期的關鍵字或經常使用語法。spa
剛好搜索時遇到相濡以沫66的文章,裏面有很好的整理。code
MySQL日期格式化(format)取值範圍。
值 | 含義 | |
---|---|---|
秒 | %S、%s | 兩位數字形式的秒( 00,01, ..., 59) |
分 | %I、%i | 兩位數字形式的分( 00,01, ..., 59) |
小時 | %H | 24小時制,兩位數形式小時(00,01, ...,23) |
%h | 12小時制,兩位數形式小時(00,01, ...,12) | |
%k | 24小時制,數形式小時(0,1, ...,23) | |
%l | 12小時制,數形式小時(0,1, ...,12) | |
%T | 24小時制,時間形式(HH:mm:ss) | |
%r | 12小時制,時間形式(hh:mm:ss AM 或 PM) | |
%p | AM上午或PM下午 | |
周 | %W | 一週中每一天的名稱(Sunday,Monday, ...,Saturday) |
%a | 一週中每一天名稱的縮寫(Sun,Mon, ...,Sat) | |
%w | 以數字形式標識周(0=Sunday,1=Monday, ...,6=Saturday) | |
%U | 數字表示週數,星期天爲週中第一天 | |
%u | 數字表示週數,星期一爲週中第一天 | |
天 | %d | 兩位數字表示月中天數(01,02, ...,31) |
%e | 數字表示月中天數(1,2, ...,31) | |
%D | 英文後綴表示月中天數(1st,2nd,3rd ...) | |
%j | 以三位數字表示年中天數(001,002, ...,366) | |
月 | %M | 英文月名(January,February, ...,December) |
%b | 英文縮寫月名(Jan,Feb, ...,Dec) | |
%m | 兩位數字表示月份(01,02, ...,12) | |
%c | 數字表示月份(1,2, ...,12) | |
年 | %Y | 四位數字表示的年份(2015,2016...) |
%y | 兩位數字表示的年份(15,16...) | |
文字輸出 | %文字 | 直接輸出文字內容 |
把單個知識點,稍微提高到某塊知識點,能讓本身的知識技能再上一個臺階。
上述表格至關實用,但依然沒有解決如何得到「某年第幾周」的需求。
雖說主動檢索找到答案,是很好的習慣。但本身耗費大量時間也沒找到答案,又偏偏有目標相同的人一塊兒互助,何不問問人看呢?學習麼,本質上是個社交行爲。在學同樣技能時,我喜歡泡幾個氛圍好的學習羣。常常在羣裏分享本身的心得筆記,也會主動力所能及地幫助別人,或者提出本身的疑問引起探討。求助就是一種很好的社交行爲啊。
此時我把疑問丟到編程學習羣,並附上紅包請教。經指點很快獲得答案,用到了concat()
函數來拼接。
方便你們拷貝學習,放一下代碼吧:
select
concat(date_format(created_at,'%Y-'),week(created_at)) as 年周,
count(user_id) as 用戶數
from
users
group by
年周
order by
年周
複製代碼
總結一下,mysql中可經過date_format()
和 concat()
,week()
等函數可完成數據分析中經常使用的月報、週報中按月、周統計的需求。關鍵語句爲:
date(column_name) as 年月日
date_format(column_name,'%Y-%m') as 年月
concat(date_format(column_name,'%Y-'),week(column_name) as 年周
這篇筆記除了知識點,我也放了本身探索擴展技能的思路。是否對你有啓發呢?若是有,記得留言或點贊告訴我,鼓勵我多多分享。
特別申明:這篇筆記圖中數據爲本地數據庫,僅供本人練習使用,並不是任何產品網站的正式數據。