你的位置:
问答吧
-> 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