終于暫時(shí)閑下來了,一個(gè)項(xiàng)目加班加點(diǎn)一年多,前面太忙就顧不上博客了,慢慢的就懈怠了,最近算是暫時(shí)閑下來了,項(xiàng)目已經(jīng)驗(yàn)收進(jìn)入后期維護(hù)階段,每天空余的時(shí)間也多了,想重新拾起博客,不求寫什么高深的東西,以后就盡量就每次自己遇到的問題,并把解決方法在這里記錄一下,可能顯得很簡(jiǎn)單不適合他人看,但是就當(dāng)自己日記一樣記錄還是不錯(cuò)的,因?yàn)樵谶@個(gè)項(xiàng)目里我有好幾次遇到類似的以前解決過的問題,卻還是要看了自己當(dāng)初的百度提問才得以解答,還是要記錄下比較好。
創(chuàng)新互聯(lián)建站秉承實(shí)現(xiàn)全網(wǎng)價(jià)值營(yíng)銷的理念,以專業(yè)定制企業(yè)官網(wǎng),成都做網(wǎng)站、成都網(wǎng)站設(shè)計(jì),微信平臺(tái)小程序開發(fā),網(wǎng)頁設(shè)計(jì)制作,移動(dòng)網(wǎng)站建設(shè),營(yíng)銷型網(wǎng)站幫助傳統(tǒng)企業(yè)實(shí)現(xiàn)“互聯(lián)網(wǎng)+”轉(zhuǎn)型升級(jí)專業(yè)定制企業(yè)官網(wǎng),公司注重人才、技術(shù)和管理,匯聚了一批優(yōu)秀的互聯(lián)網(wǎng)技術(shù)人才,對(duì)客戶都以感恩的心態(tài)奉獻(xiàn)自己的專業(yè)和所長(zhǎng)。
這次要記錄的是昨天客戶找我要一個(gè)關(guān)于注冊(cè)用戶年齡段,性別分布情況,當(dāng)時(shí)把我卡住了,等到解決了才發(fā)現(xiàn)其實(shí)這個(gè)sql我大二考試的時(shí)候就寫過,只是把以前是班級(jí)現(xiàn)在是年齡,以前是sqlserver現(xiàn)在是mysql而已,話不多說,解決過程如下:
首先,是我們數(shù)據(jù)庫的當(dāng)前內(nèi)容:
然后我們要給他最終統(tǒng)計(jì)成三個(gè)字段:年齡男女
需要的最終統(tǒng)計(jì)結(jié)果圖如下:
步驟1:我們要把先他統(tǒng)計(jì)成 年齡,性別 的結(jié)果
sql:
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age,t1.sex
FROM test t1
ORDER BY age
其結(jié)果如下:
步驟2:將上圖的結(jié)果作為臨時(shí)表,再統(tǒng)計(jì)成最終結(jié)果圖
sql:
SELECT CONCAT(age,'歲') AS '年齡',SUM(CASE WHEN sex='男' THEN 1 ELSE 0 END) AS '男',SUM(CASE WHEN sex='女' THEN 1 ELSE 0 END) AS '女'
FROM
(
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age,t1.sex
FROM test t1
ORDER BY age
) AS tt
GROUP BY age
在Mysql中計(jì)算年齡:
SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age FROM 表名;
報(bào)錯(cuò)是因?yàn)?沒有這個(gè)方法
可能的原因是 1 方法是自定義的 你當(dāng)前數(shù)據(jù)庫中沒有寫入這個(gè)方法
2 這個(gè)方法是官方的但是 版本號(hào)不同 這個(gè)方法被取消了
解決的方法 1 寫入這個(gè)方法調(diào)用 2 更換 對(duì)應(yīng)版本的 mysql
以前使用mysql不是很多,對(duì)mysql的函數(shù)也不是很熟悉,遇到這個(gè)問題第一時(shí)間百度搜索,搜索到這兩種方法,這兩種方法是排在百度第一條的博客。
方法一,作者也說出了缺陷,就是當(dāng)日期為未來日期時(shí)結(jié)果為0,而不是負(fù)數(shù);這里使用了5個(gè)函數(shù)和兩個(gè)運(yùn)算符。
方法二,解決了方法一為負(fù)數(shù)的問題,但看起來更復(fù)雜;這里使用了6個(gè)函數(shù)和3個(gè)運(yùn)算符。
看了這篇貼子后,我就暈了,怎么會(huì)這么復(fù)雜,以前用Sql Server很簡(jiǎn)單就可以了。我堅(jiān)信一定有簡(jiǎn)單高效的方法。很快就找到了根據(jù)以上方法改良后的方法。
改良后的方法一,少了一個(gè)函數(shù)和一個(gè)運(yùn)算符,當(dāng)日期為未來日期時(shí)計(jì)算結(jié)果還是為0;
改良后的方法二,還是6個(gè)函數(shù)和3個(gè)運(yùn)算符,看起來簡(jiǎn)單些;取日期的右邊五位,當(dāng)日期格式為‘2013-01-01’時(shí)取到的是‘01-01’,沒有問題;當(dāng)日期格式為‘2013-1-1’縮寫格式時(shí),取右邊的五位取出的是‘3-1-1’,會(huì)導(dǎo)致出錯(cuò)。
然后自己根據(jù)MYSQL的幫助文檔中的日期函數(shù)想到了第三種方法:
取生日和當(dāng)前日期之前的天數(shù)除以一年的實(shí)際天數(shù)(365天5小時(shí)48分46秒),然后取整。這樣只用了三個(gè)函數(shù)和一個(gè)運(yùn)算符就搞定了。
然后,很快在國外網(wǎng)站找到了第四種方法:
這種方法只用了兩個(gè)函數(shù)就搞定了,應(yīng)該是最佳方法了。
測(cè)試了一下以上四種方法,假如當(dāng)前日期為'2017-1-13',當(dāng)生日為‘2013-1-14’時(shí),還差一天就要過生日了,離4歲只 差一天了,結(jié)果還是3歲,感覺不是很合理;把方法三改造一下,四舍五入得到方法五:
這樣計(jì)算出的年齡離實(shí)際的周歲最接近了,但可能方法四是最符合年齡定義的了。