mysql年龄段统计_怎么分年龄段查询、统计?

你的位置:

问答吧

-> PHP基础

-> 问题详情

怎么分年龄段查询、统计?

人员的资料中有“出生日期”字段,问:

如何按照每5年为一个区间去查询统计人员数据?

我初步只能想到,先把所有记录都取出来,然后对每条记录遍历,计算岁数然后对应的年龄段+1。

可是这样效率比较低。请问用SQL有可能实现吗?

作者: diekiss

发布时间: 2006-06-07

每五年一个段,那起始年月呢???最好别取出来再过滤,直接让数据库计算

作者: sunjava

发布时间: 2006-06-07

这个感觉无论怎么分执行效率肯定很低

作者: 蟋蟀

发布时间: 2006-06-08

请问楼主想干啥.或许有别的办法.

作者: 游戏人间

发布时间: 2006-06-08

SELECT Year(`birthday`) x, FLOOR(Year(`birthday`)/5) AS y,birthday,sid FROM `user` WHERE birthday>0  order by y

或者

SELECT FLOOR( Year( `birthday` ) /5 ) AS y, birthday, sid

FROM `user`

WHERE FLOOR( Year( `birthday` ) /5 ) = FLOOR( 1990 /5 )

[ 本帖最后由 纯粹误会 于 2006-6-8 02:36 AM 编辑 ]

作者: 纯粹误会

发布时间: 2006-06-08

我不知道相同的运算,php和mysql哪个效率更高一些

作者: sanders_yao

发布时间: 2006-06-08

计算工龄么?

作者: zjhcloth

发布时间: 2006-06-08

CODE:

[Copy to clipboard]

$result = mysql_query("select year(`date`),count(*) from database.table group by year(`date`)");

while($row = mysql_fetch_row($result)){

!isset($year_start) && $year_start = $row[0];

if($row[0] 

$nums[$year_start] += $row[1];

}else{

do{

$year_start += 5;

$nums[$year_start] = 0;

}while($year_start <= $row[0]-5);

$nums[$year_start] += $row[1];

}

}

?>[ 本帖最后由 沉默的狼 于 2006-6-8 01:38 PM 编辑 ]

作者: 沉默的狼

发布时间: 2006-06-08

year('date') 的算法似乎不是很准确,例如现在是6月,那么1月的和12月出生的人就相当于没相差了,与现实不符。

我现在做的是就业信息服务方面的软件,需要对求职人做一个统计,计算出21-25,26-30,31-35,36-40,41-450.... 如此类推的分段统计

作者: diekiss

发布时间: 2006-06-08

把year(`date`)换成year(date_add(`date`,interval 180 day))不就可以了吗?

如果要计算岁数可以把$nums[$year_start] 改成$nums[date("Y")-$year_start]

[ 本帖最后由 沉默的狼 于 2006-6-8 04:30 PM 编辑 ]

作者: 沉默的狼

发布时间: 2006-06-08

CODE:

[Copy to clipboard]

$year_start = 1901;

$thisyear = date("Y");

$thisday = date("z");

$result = mysql_query("select year(date_add(`date`,interval $thisday day)),count(*) from database.table group by year(date_add(`date`,interval $thisday day))");

while($row = mysql_fetch_row($result)){

!isset($year_start) && $year_start = $row[0];

if($row[0] 

$nums[$thisyear-$year_start] += $row[1];

}else{

do{

$year_start += 5;

$nums[$year_start] = 0;

}while($year_start <= $row[0]-5);

$nums[$thisyear-$year_start] += $row[1];

}

}

?>[ 本帖最后由 沉默的狼 于 2006-6-8 04:48 PM 编辑 ]

作者: 沉默的狼

发布时间: 2006-06-08

天数还可以实时算出来

[ 本帖最后由 沉默的狼 于 2006-6-8 04:43 PM 编辑 ]

作者: 沉默的狼

发布时间: 2006-06-08

1、只year(date)/5 的算法是错误的,因为这样只计算出date归属于哪个5年组。而楼主要求的是年龄组。比如24岁今年归属20-24岁组,明年就归属25-29岁组。因此就需要在计算中引入当前时间

floor((year(now())-year(date))/5)*5

2、考虑到年龄应按周岁计算,所以需要出生年做一个校正

已知函数DAYOFYEAR(date) 返回date在一年中的日数, 在1到366范围内。

那么dayoyear(now())-dayofyear(date) 若为负值则生日未到,应少记一岁

所以出生年应写做if(dayoyear(now())-dayofyear(date)<0, year(date)+1, year(date))

3、把2式代入1式,并作为分组依据

4、不保证所用函数在其他数据库中可用

5、要通用时,应提出数据用php计算

6、使用php计算要慢于数据库计算。理由很简单,数据库计算后只返回数条结果;php计算时需要先获得全部数据,可能成千上万。至少交换数据的时间就要多很多了

7、注意:在使用php进行计算时不能做分组处理,以免丢失相关数据

作者: 唠叨

发布时间: 2006-06-08

版主分析得很好。我还要研究一下,因为项目用MySQL4,所以有些函数不能用

作者: diekiss

发布时间: 2006-06-19

在MySQL的手册 3.3.4.5. Date Calculations 是这样就计算年龄的:

mysql> SELECT name, birth, CURDATE(),

-> (YEAR(CURDATE())-YEAR(birth))

-> - (RIGHT(CURDATE(),5)

-> AS age

-> FROM pet;

作者: diekiss

发布时间: 2006-06-19

1、我示例的函数在mysql4.0.1就可以使用了

2、楼主示例的代码确实很简练

要点: (RIGHT(CURDATE(),5)

巧妙的利用了布尔值进行运算

注意:CURDATE()和NOW()是一样的

作者: 唠叨

发布时间: 2006-06-19

CURDATE 输出格式 ‘YYYY-MM-DD'

NOW() 输出格式 'YYYY-MM-DD HH:MM:SS'

如果用RIGHT运算,二者就有差别了

作者: diekiss

发布时间: 2006-06-19

不是还有substr吗

作者: 唠叨

发布时间: 2006-06-19

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值