根据身份证号计算年龄 MySQL

文章讨论了在SQL查询中计算个人年龄时出现的问题,原方法有时会少算一岁。提出了新的计算规则,先计算当前年份与出生年份的差值,再判断当前日期是否已过生日,决定是否需要减去一岁。新方法能更准确地确定年龄。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

    <select id="getListHmsAbnormalSendStaff" resultType="com.qc.hms.api.manage.domain.vo.HmsAbnormalSendStaffVo"
            parameterType="com.qc.hms.api.manage.domain.bo.HmsStaffHealthadvisorBo">
        SELECT
send.id,
send.staff_id,
ent.staff_name,
ent.phone,
getDepartDetailName(ent.depart_id ) depart_name,
ent.sex,
ent.care_flag,
(substring(now(),1,4)-substring(ent.idcard,7,4)-(date_format(now(),'%m%d')-substring(ent.idcard,11,4)>0)) as "age"
FROM hms_abnormal_send send
LEFT JOIN ent_staff ent
ON send.staff_id=ent.id
LEFT JOIN hms_staff_healthadvisor hea
ON hea.staff_id=send.staff_id
<where>
    ent.is_quit='0' and  ent.del_flag='0' AND send.send_type='0'
    <if test="bo.advisorUserId !=null and bo.advisorUserId !=''">
       and hea.advisor_user_id=#{bo.advisorUserId}
    </if>
    <if test="bo.staffId !=null and bo.staffId !=''">
        and ent.id=#{bo.staffId}
    </if>
    <if test="bo.staffName !=null and bo.staffName !=''">
        <bind name="boStaffName" value="'%'+bo.staffName+'%'"/>
        and ent.staff_name like #{boStaffName}
    </if>
</where>
GROUP BY send.staff_id
    </select>

补充:
在使用中发现这种计算有时候会少一岁

	SELECT f.staff_id, e.staff_name, e.phone, e.idcard, e.sex, (substring(now(), 1, 4) - substring(e.idcard, 7, 4) - (date_format(now(), '%m%d') - substring(e.idcard, 11, 4) > 0)) AS "age" FROM hms_family_members f LEFT JOIN ent_staff e ON f.staff_id = e.id WHERE f.home_id = (SELECT home_id FROM hms_family_members s WHERE s.staff_id = 'p211115135355690' AND s.del_flag = '0') AND f.del_flag = e.del_flag AND f.del_flag = '0'
	

在这里插入图片描述

现在换用方式如下
计算规则:先取出身份证上的年份并计算年份与当前年份的差,再比较当前日期与身份证上的月日(即判断此人是否已经过了国历生日),决定是否需要减去一岁,已经过了生日的就不用减掉了。

1、先计算当前年份与与出生年份的差值

- 通过substring() 函数取出生年月、身份证号从第七位开始是出生年月,取四位
	- substring(idcard,7,4- 当前月份,通过now()函数获取
	- substring(now(),1,4):当前年份是2022- 减法求当前年份到出生年份之间差值
	- substring(now(),1,4)-substring(idcard,7,4)

2、比较当前日期与身份证号上的日期,判断是否已经过了生日,来决定是否用当前年龄年月减去1。已经过完生日的不需要减

- 获取当前月份天数,通过date_format() 函数
	- date_format(now(),'%m%d')
- 取身份证号上的出生日期,从第十一位开始,取四位
	- substring(idcard,11,4)
- 做减法,计算当前日期与出生日期的差值,如果大于0,说明,说明已经过过生日,则年月不用减一
	- if(DATE_FORMAT(NOW(),'%m%d')-SUBSTRING(idcard,11,4)>0,0,1 )

3、完整sql

(substring(NOW(),1,4) - SUBSTRING(idcard,7,4) - (if(DATE_FORMAT(NOW(),'%m%d')-SUBSTRING(idcard,11,4)>0,0,1  ) )  )	as 'age'

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值