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 ;
这个函数可以计算下次生日的日期.
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值