<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'