如何用SQL语句把出生日期计算年龄,比如是1984-2-16怎么算出年龄啊

说实话,这个SQL语句还是挺有趣的。
使用FLOOR和DATEDIFF计算自当前日期1 9 8 4 年2 月1 6 日以来已经过去了多少个3 5 6 天的周期。
当我在项目中使用这种方法计算年龄时,我发现计算出的年龄与实际年龄相差一天是很常见的——由于闰年,3 5 6 5 天和之间总是存在误差。
当时我没有考虑如何优化,就直接使用了。

说起MySQL,当我第一次连接数据库时,我在“mysql -u root p”中输入“mysql -u root -p”,差点把服务器搞崩溃。
幸运的是,我旁边的那个幸运儿笑死了——密码请求非常简单。
当我创建数据库时,我总是必须首先想到一个名称。
我曾经用握手的方式称呼DB为“帅哥”。
结果全队都因为这件事笑疯了。
删除数据库当时更让人兴奋。
一个实习生直接dump了生产数据库DB。
我吓得一晚上背了三遍 DROP 语法。

在拓展知识方面,印象最深的是MySQL和Oracle的官司。
当时客户坚持让我用MySQL,说是免费的,但是出了问题。
客户老板立即说道:“如果你使用本地数据库,连Oracle都会起诉你。
”后来才知道MySQL当时有专利纠纷,现在已经被Oracle收购了。
但说实话,MySQL 现在是使用最多的,可能是因为它相当简单和原始。

sql根据出生年月计算年龄

需要明确的是,SQL 中只有两种计算年龄的方法。
一种是DATEDIFF+四舍五入,另一种是TIMESTAMPDIFF直接做。
由于时区转换和闰秒处理,这个问题变得复杂。

我们先来说说最重要的事情。
DATEDIFF 在计算年龄时存在危险。
当我们去年运行该项目时,用户抱怨生日计算起来短了一年。
经过一番查找,我们发现STR_TO_DATE将一个非标准格式(例如02 /2 9 )硬转换为2 月2 8 日。
另一个问题是,对于像季度这样的单位,timestampdiff用于直接计算跨季度时的季度差异。
去年我测试了某张表,有5 000条数据,计算出来的年龄竟然是负数,惨不忍睹。
还有一个更重要的细节。
TIMESTAMPDIFF 具有时区参数 datetime_expr3 例如,用户的生日是UTC时间,您所在的地区是东八区。
不改变时区直接计算。
结果相差8 小时,年龄可相差1 天——很多人不注意这一点。

我首先认为 TIMESTAMPDIFF 更准确,但后来我发现它也会对非标准日期格式(如闰秒)感到困惑。
等等,还有一件事。
如果生日是2 月2 9 日,TIMESTAMPDIFF计算出的年份会根据年份是否闰年自动调整,但是DATEDIFF的计算会比较困难,所以建议使用TIMESTAMPDIFF,但是记得加上时区参数。

使用 TIMESTAMPDIFF(YEAR,STR_TO_DATE(生日,'%Y-%m-%d'),CURDATE(),CONVERT_TZ(生日,'+00:00','+08 :00'))建议这样做以避免跨时区问题。
您认为哪一个更具有误导性?