首頁  >  文章  >  資料庫  >  總結MySQL計算年齡的五種方法及各自的優缺點

總結MySQL計算年齡的五種方法及各自的優缺點

零下一度
零下一度原創
2017-05-05 16:39:411732瀏覽

以前使用mysql不是很多,對mysql的函數也不是很熟悉,遇到這個問題第一時間百度搜索,搜索到這兩種方法,這兩種方法是排在百度第一條的博客。

方法一

SELECT DATE_FORMAT(FROM_DAYS(TO_DAYS(NOW())-TO_DAYS(birthday)), '%Y')+0 AS age

方法一,作者也說出了缺陷,就是當日期為未來日期時結果為0,而不是負數;這裡使用了5個函數和兩個運算符。

方法二

SELECT DATE_FORMAT(NOW(), &#39;%Y&#39;) - DATE_FORMAT(birthday, &#39;%Y&#39;) - (DATE_FORMAT(NOW(), &#39;00-%m-%d&#39;) < DATE_FORMAT(birthday, &#39;00-%m-%d&#39;)) AS age

方法二,解決了方法一為負數的問題,但看起來更複雜;這裡使用了6個函數和3個運算子。

看了這篇貼文後,我就暈了,怎麼會這麼複雜,以前用Sql Server很簡單就可以了。我堅信一定有簡單有效率的方法。很快就找到了根據以上方法改良後的方法。

改良後方法一和方法二

SELECT year( from_days( datediff( now( ), birthdate)));
SELECT YEAR(CURDATE())-YEAR(birthday)-(RIGHT(CURDATE(),5)<RIGHT(birthday,5));

改良後的方法一,少了一個函數和一個運算符,當日期為未來日期時計算結果還是為0;
改良後的方法二,還是6個函數和3個運算符,看起來簡單些;取日期的右邊五位,當日期格式為'2013-01-01'時取到的是'01-01',沒有問題;當日期格式為'2013-1-1'縮寫格式時,取右邊的五位取出的是'3-1-1',會導致出錯。

然後自己根據MYSQL的幫助文件中的日期函數想到了第三種方法:

方法三

SELECT FLOOR(DATEDIFF(CURDATE(), @birthday)/365.2422)

取生日和當前日期之前的天數除以一年的實際天數(365天5小時48分46秒),然後取整。這樣只用了三個函數和一個運算子就搞定了。

然後,很快在國外網站找到了第四種方法:

#方法四

 SELECT  TIMESTAMPDIFF(YEAR, @birthday, CURDATE())

這種方法只用了兩個函數就搞定了,應該是最佳方法了。

測試了一下以上四種方法,假如當前日期為'2017-1-13',當生日為'2013-1-14'時,還差一天就要過生日了,離4歲只差一天了,結果還是3歲,感覺不是很合理;把方法三改造一下,四捨五入得到方法五:

方法五

SELECT ROUND(DATEDIFF(CURDATE(), @birthday)/365.2422)

這樣計算出的年齡離實際的周歲最接近了,但可能方法四是最符合年齡定義的了。

【相關推薦】

1. 免費mysql線上影片教學

2. MySQL最新手冊教學

3. 布林教育燕十八mysql入門影片教學

#

以上是總結MySQL計算年齡的五種方法及各自的優缺點的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn