MySQL实现出生年月转年龄

描述及实现

表达函数:

f ( b i r t h d a y ) = { n o w D a t e − b i r t h d a y ( 岁 ) n o w D a t e − b i r t h d a y ≥ 1 年 n o w D a t e − b i r t h d a y ( 月 ) 1 年 > n o w D a t e − b i r t h d a y ≥ 1 月 n o w D a t e − b i r t h d a y ( 天 ) 1 月 > n o w D a t e − b i r t h d a y ≥ 0 天 f(birthday)=\begin{cases} nowDate-birthday (岁) & nowDate-birthday ≥ 1年 \\ nowDate-birthday (月) & 1年 > nowDate-birthday ≥ 1月 \\ nowDate-birthday (天) & 1月 >nowDate-birthday ≥ 0天 \\ \end{cases} f(birthday)=⎩ ⎨ ⎧nowDate−birthday(岁)nowDate−birthday(月)nowDate−birthday(天)nowDate−birthday≥1年1年>nowDate−birthday≥1月1月>nowDate−birthday≥0天

  • nowDate:现在日期
  • birthday:出生年月日

SQL代码:

sql 复制代码
select
	case
		when TIMESTAMPDIFF(year,'birthday',CURDATE()) != 0 
			then CONCAT(TIMESTAMPDIFF(year, 'birthday', CURDATE()), '岁')
		when TIMESTAMPDIFF(month,'birthday',CURDATE()) != 12 * TIMESTAMPDIFF(year,'birthday',CURDATE()) 
			then CONCAT(TIMESTAMPDIFF(month, 'birthday', CURDATE())-12 * TIMESTAMPDIFF(year, 'birthday', CURDATE()), '月')
		else CONCAT(ABS(TIMESTAMPDIFF(day, 'birthday', CURDATE())), '天')
	end as age,
from
	dual;

实践及效果

示例代码:

sql 复制代码
select
	CURDATE() as currentDate,
	date_format('2023-1-14','%Y-%m-%d') as useYear, 
	case
		when TIMESTAMPDIFF(year,'2023-1-14',CURDATE()) != 0 
			then CONCAT(TIMESTAMPDIFF(year, '2023-1-14', CURDATE()), '岁')
		when TIMESTAMPDIFF(month, '2023-1-14', CURDATE()) != 12*TIMESTAMPDIFF(year, '2023-1-14', CURDATE()) 
			then CONCAT(TIMESTAMPDIFF(month, '2023-1-14', CURDATE())-12*TIMESTAMPDIFF(year, '2023-1-14', CURDATE()), '月')
		else CONCAT(ABS(TIMESTAMPDIFF(day, '2023-1-14', CURDATE())), '天')
	end as diffYear,
	date_format('2023-12-14','%Y-%m-%d') as useMonth, 
	case
		when TIMESTAMPDIFF(year ,'2023-12-14',CURDATE()) != 0 
			then CONCAT(TIMESTAMPDIFF(year, '2023-12-14', CURDATE()), '岁')
		when TIMESTAMPDIFF(month, '2023-12-14', CURDATE()) != 12*TIMESTAMPDIFF(year, '2023-12-14', CURDATE()) 
			then CONCAT(TIMESTAMPDIFF(month, '2023-12-14', CURDATE())-12*TIMESTAMPDIFF(year, '2023-12-14', CURDATE()), '月')
		else CONCAT(ABS(TIMESTAMPDIFF(day, '2023-12-14', CURDATE())), '天')
	end as diffMonth,
	date_format('2024-1-14','%Y-%m-%d') as useDay, 
	case
		when TIMESTAMPDIFF(year,'2024-1-14',CURDATE()) != 0 
			then CONCAT(TIMESTAMPDIFF(year, '2024-1-14', CURDATE()), '岁')
		when TIMESTAMPDIFF(month, '2024-1-14', CURDATE()) != 12*TIMESTAMPDIFF(year, '2024-1-14', CURDATE()) 
			then CONCAT(TIMESTAMPDIFF(month, '2024-1-14', CURDATE())-12*TIMESTAMPDIFF(year, '2024-1-14', CURDATE()), '月')
		else CONCAT(ABS(TIMESTAMPDIFF(day, '2024-1-14', CURDATE())), '天')
	end as diffDay
from
	dual;

示例效果:

使用总结

对于涉及到人的年龄表来说,由于年龄会随着时间变化而变化,一般不合适直接存储年龄字段。所以就需要通过存储的出生年月日,进行动态计算。

相关推荐
vx_Biye_Design2 小时前
springboot宠物领养与救助平台64334-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·课程设计·宠物
做运维的阿瑞2 小时前
mysql数据库视图笔记:创建、修改、删除与适用场景
数据库·笔记·mysql
java1234_小锋3 小时前
【技术专题】Mysql8 数据库 - Mysql8 数据库基本操作
数据库·mysql
专业程序开发源3 小时前
springboot生命故事书制作小程序65290-计算机课程设计、毕业设计
java·vue.js·spring boot·后端·mysql·小程序·课程设计
jason.zeng@15022074 小时前
canal做mysql的异步传输工具
数据库·mysql·linq
Shadow(⊙o⊙)4 小时前
MySQL C/C++链接MySQL使用
数据库·sql·mysql
FYKJ_20104 小时前
springboot手工蜀绣在线销售系统60947-计算机课程设计、毕业设计
java·spring boot·后端·python·mysql·spark·课程设计
Mortalbreeze4 小时前
MySQL 基础篇(五):数据操作基础 —— CRUD
linux·服务器·数据库·mysql
Shadow(⊙o⊙)4 小时前
mysql为创建普通用户并创建库赋权
数据库·sql·mysql
Q26433650234 小时前
【有源码】基于springboot的知识产权管理系统-知识产权咨询问答管理系统-知识产权价值评估管理系统
java·spring boot·mysql·spring·毕业设计·javaweb·课程设计