十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
年龄段统计可用case when 语句。
创新互联公司长期为超过千家客户提供的网站建设服务,团队从业经验10年,关注不同地域、不同群体,并针对不同对象提供差异化的产品和服务;打造开放共赢平台,与合作伙伴共同营造健康的互联网生态环境。为当涂企业提供专业的网站设计制作、做网站,当涂网站改版等技术服务。拥有十年丰富建站经验和众多成功案例,为您定制开发。
如test表中有以下数据:
其中18-29岁为青年,30-49岁为中年,50岁以上为老年,先统计各个年龄段人数,可用如下语句:
select case when age between 18 and 29 then '青年' when age between 30 and 59 then '中年' when age=60 then '老年' end as 年龄段,
count(*) as 人数
from test
group by case when age between 18 and 29 then '青年' when age between 30 and 59 then '中年' when age=60 then '老年' end;
统计结果:
根据出生日期查询年龄用的还挺多的。
简单分析一下,加入一个孩子五岁半了,那习惯认为他还是5岁。
用Oracle提供的months_between()函数,先获取出生日期和当前日期的月数,然后除以12向下取整:
使用的时候,将时间段替换成出生日期对应的字段即可。
如果,计算年龄用的次数非常多,最好写成自定义函数。
这个办法很多,如果是比较精确的可以用month_between函数,然后除以12,最后在trunc这样就能得到具体的年龄了。
比如trunc(month_between(sysdate,时间类型的生日字段)/12)
个人感觉这个精确一些,能精确到天,只要还没过生日,那么就不会加一岁。
当然二者直接相减trunc((sysdate-时间类型的生日字段)/365)也可以。
sysdate-时间类型的生日字段,这么相减默认出现的是相差的天数,所以除以365。这个也可以,不过有些年是366天,不过因为366天的年分比较少,所以基本上不会相差很多。只是会出现,“提前”的情况。不过80年最多才21天(大概是这样,我没细算,就算四年一次),所以对实际影响不是特别大。如果要求准确那么还是上面的靠谱一些。
用函数取出字段年,然后用现在的年相减也可以。这个就是一个大概(个人认为更加不靠谱),比如一个人2050年12月30日出生,现在是2055年后的1月1号,那么按照年来说就是5,但是其实才4岁多一点,所以年这个只是一个大概的,不会十分准确。
SELECT ROUND(MONTHS_BETWEEN(SYSDATE,PBIRTHDAY)/12) age FROM MEMB_OF_BEDROOM;(其中PBIRTHDAY是你表的那个时期列名,如果你给的设计结构中名称是真实的物理代码名称的话。。)。
顺道提醒两点:
1.请确定“T.生日”中的生日一列是否真实存在,一般情况下,处于后期隐患考虑,不建议用中文来定义列名。“生日”最好用comment的形式进行列别名注释;
2.getdate()印象中不是oracle的内置sql函数,year函数亦同(除非是自己书写的存储函数),我妄测是讲某高级编程语言生搬过来而成。 (一般sql查询语句在分析时,只分析其内在支持的函数和变量,不属于其内在支持的函数和变量以及非关键字一律当做字符串处理,不负责调用和编译)
select floor(months_between(to_date(concat(extract(year from sysdate),'-10-31'),'YYYY-MM-DD'),to_date(生日的日期,'yyyy-mm-dd'))/12) from table_name
floor 向下取整
months_between 日期相差的月份数
concat字字符串连接
extract(year from sysdate) 返回当前日期的年份