最近在统计用户年龄,并且需要分组来计数:

记录一下,学习


第一种方法
-- 统计小于18 岁
SELECT IFNULL(count(id),0)num1 fromwhere TIMESTAMPDIFF(YEAR,生日字段,now()) < 18
UNION All
-- 统计18-30 岁之间,包含18,30
SELECT IFNULL(count(id),0)num2 from  where TIMESTAMPDIFF(YEAR,生日字段,now()) between 18 and 30
UNION all
-- 统计31-44 岁之间,包含31,44
SELECT IFNULL(count(id),0)num3 from  where TIMESTAMPDIFF(YEAR,生日字段,now()) between 31 and 44
UNION all
-- 统计45-59 岁之间,包含45,60
SELECT IFNULL(count(id),0)num4 from  where TIMESTAMPDIFF(YEAR,生日字段,now())  between 45 and 60
UNION all
-- 统计大于60 岁
SELECT IFNULL(count(id),0)num5 from  where TIMESTAMPDIFF(YEAR,生日字段,now()) > 60 

查询结果如下:在这里插入图片描述

第二种方法(推荐)
SELECT 
SUM(if(((year(now())-year(生日字段)-1) + ( DATE_FORMAT(生日字段), '%m%d') <= DATE_FORMAT(NOW(), '%m%d') )<18),1,0)) AS '18岁以下',
SUM(if(((year(now())-year(生日字段)-1) + ( DATE_FORMAT(生日字段), '%m%d') <= DATE_FORMAT(NOW(), '%m%d') )BETWEEN 18 and 30),1,0)) AS '18-30岁之间',
SUM(if(((year(now())-year(生日字段)-1) + ( DATE_FORMAT(生日字段), '%m%d') <= DATE_FORMAT(NOW(), '%m%d') )BETWEEN 31 and 45),1,0)) AS '31-44之间',
SUM(if(((year(now())-year(生日字段)-1) + ( DATE_FORMAT(生日字段), '%m%d') <= DATE_FORMAT(NOW(), '%m%d') )BETWEEN 46 and 60),1,0)) AS '45-60之间',
SUM(if(((year(now())-year(生日字段)-1) + ( DATE_FORMAT(生日字段), '%m%d') <= DATE_FORMAT(NOW(), '%m%d') )>60),1,0)) AS '60以上'
FROM

查询结果集:
在这里插入图片描述


计算年龄的SQL

SELECT ROUND((TO_DAYS(NOW())-TO_DAYS(生日字段))/365) age from 表

TIMESTAMPDIFF用法: TIMESTAMPDIFF(unit,begin,end);
TIMESTAMPDIFF函数允许其参数具有混合类型,例如,begin是DATE值,end可以是DATETIME值。 如果使用DATE值,则TIMESTAMPDIFF函数将其视为时间部分为“00:00:00”的DATETIME值。
第一个是 参数
FRAC_SECOND。表示间隔是毫秒
SECOND。秒
MINUTE。分钟
HOUR。小时
DAY。天
WEEK。星期
MONTH。月
QUARTER。季度
YEAR。年

第二个参数 是 要对比的时间中时间小的
第三个参数 时间大的参数。
函数结果返回begin-end的结果,其中begin和end是DATE或DATETIME表达式。

eg:

 SELECT TIMESTAMPDIFF(MONTH, '2018-01-01', '2018-06-01') result;

结果集:
在这里插入图片描述

-- 计算 时间字段和当前相差年数  即  计算年龄 
select TIMESTAMPDIFF(year,时间字段,NOW()) from

结果集:
在这里插入图片描述

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐