MySQL根據出生日期計算年齡的五種方法比較

方法一

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

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

方法二

SELECT DATE_FORMAT(NOW(), '%Y') - DATE_FORMAT(birthday, '%Y') - (DATE_FORMAT(NOW(), '00-%m-%d') < DATE_FORMAT(birthday, '00-%m-%d')) 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’,會致使出錯。spa

而後本身根據MYSQL的幫助文檔中的日期函數想到了第三種方法:code

方法三

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

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

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

方法四

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

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

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

方法五

SELECT ROUND(DATEDIFF(CURDATE(), @birthday)/365.2422)
相關文章
相關標籤/搜索