MySQL年龄日期问题

模拟数据如下,使用了数字辅助表创建数据.
http://blog.itpub.net/29254281/viewspace-1362897/

drop table if exists t;
create table t
(
    id int primary key auto_increment,
    birthday datetime 
);

truncate table t;

insert into t(birthday)
select date_add('2011-12-15',interval id day) from nums limit 10; 

insert into t(birthday)
select date_add('2010-2-26',interval id day) from nums limit 10; 

insert into t(birthday)
select date_add('2008-2-26',interval id day) from nums limit 10; 

今天是2014-12-19 ,t表模拟用户表,birthday模拟用户的出生日期


一开始我把问题想简单了,就想用year(now())-year(birthday) 
但是当前日期在生日之前和生日之后,会有1年的误差.

最后处理的方式如下
select id,birthday,
case when 
    date_add(birthday,interval year(now())-year(birthday) year)>=now()
then 
    year(now())-year(birthday)-1
else
    year(now())-year(birthday)
end age
from t;


如果需要计算用户的下次生日日期,参考MySQL技术内幕实现如下
1.先计算当前和出生日期的年份差值
2.出生日期加年份差值,和年份差值+1
3.如果生日是闰年29日,而当前年不是闰年,则判定生日为3月1日
  1. select id,birthday,if(cur>today,cur,next) as target
  2. from 
  3. (
  4.     select id,birthday,today,
  5.     date_add(cur,interval if(day(birthday)=29&&day(cur)=28,1,0) day) as cur,
  6.     date_add(next,interval if(day(birthday)=29&&day(next)=28,1,0) day) as next
  7.     from
  8.     (
  9.         select id,birthday,today,
  10.         date_add(birthday,interval diff year) as cur,
  11.         date_add(birthday,interval diff+year) as next
  12.         from
  13.         (
  14.             select id,birthday,(year(now())-year(birthday)) as diff,now() as today from t
  15.         ) a
  16.     ) b 
  17. ) c;

可以制作一个函数

  1. SET GLOBAL log_bin_trust_function_creators = 1;
  2. delimiter $$
  3. create function age(birthday datetime)
  4. returns datetime
  5. begin
  6. return (
  7.     select if(cur>today,cur,next) as target
  8.     from 
  9.     (
  10.         select birthday,today,
  11.         date_add(cur,interval if(day(birthday)=29&&day(cur)=28,1,0) day) as cur,
  12.         date_add(next,interval if(day(birthday)=29&&day(next)=28,1,0) day) as next
  13.         from
  14.         (
  15.             select birthday,today,
  16.             date_add(birthday,interval diff year) as cur,
  17.             date_add(birthday,interval diff+year) as next
  18.             from
  19.             (
  20.                 select birthday,(year(now())-year(birthday)) as diff,now() as today from dual
  21.             ) a
  22.         ) b 
  23.     ) c
  24. );
  25. end$$
  26. delimiter ;
这个函数可以计算下次生日的日期.
MySQL中,可以利用`CURDATE()`函数获取当前日期,结合存储出生日期的字段,通过一定的计算来判断年龄。以下是几种常见的实现方式: ### 使用`TIMESTAMPDIFF`函数 `TIMESTAMPDIFF`函数可以计算两个日期之间的值,以指定的时间单位返回结果。若要计算年龄,可使用`YEAR`作为时间单位。 示例代码如下: ```sql -- 假设表名为person,存储出生日期的字段名为birth_date SELECT person_id, birth_date, TIMESTAMPDIFF(YEAR, birth_date, CURDATE()) AS age FROM person; ``` 在上述代码中,`TIMESTAMPDIFF(YEAR, birth_date, CURDATE())`会计算从`birth_date`到当前日期的年数值,即年龄。 ### 使用`YEAR`函数相减 也可以分别提取当前日期和出生日期的年份,然后相减,但这种方法不够精确,因为没有考虑月份和日期。 示例代码如下: ```sql -- 假设表名为person,存储出生日期的字段名为birth_date SELECT person_id, birth_date, YEAR(CURDATE()) - YEAR(birth_date) AS age FROM person; ``` 此方法仅简单地将当前年份减去出生年份,没有考虑生日是否已过,可能会导致年龄计算不准确。 ### 综合考虑月份和日期 为了更精确地计算年龄,可以结合`YEAR`、`MONTH`和`DAY`函数进行判断。 示例代码如下: ```sql -- 假设表名为person,存储出生日期的字段名为birth_date SELECT person_id, birth_date, CASE WHEN MONTH(CURDATE()) > MONTH(birth_date) OR (MONTH(CURDATE()) = MONTH(birth_date) AND DAY(CURDATE()) >= DAY(birth_date)) THEN YEAR(CURDATE()) - YEAR(birth_date) ELSE YEAR(CURDATE()) - YEAR(birth_date) - 1 END AS age FROM person; ``` 在这段代码中,使用`CASE`语句进行判断。若当前月份大于出生月份,或者当前月份等于出生月份且当前日期大于等于出生日期年龄为当前年份减去出生年份;否则,年龄为当前年份减去出生年份再减1。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值