您的位置:首页 > 数据库 > MySQL

MySql生日闰月处理

2016-08-21 18:35 183 查看
1. 科普下润年:

①、非整百年能被4整除的为闰年。(如2004年就是闰年,2100年不是闰年)
②、整百年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)

2. 例:
例如:当前日期是2016年8月21日,有人出生在1972年2月29日,查询后该用户最近的生日应该是2017年3月1日(非闰年)。如果当前日期是2016年1月20日,那么查询后应该返回2016年2月29日(闰年)。

3. 初始数据

先安装mysql官方示例数据库employees。没安装的可以参考:《MAC安装MYSQL官方示例数据库EMPLOYEE

脚本操作:

-- 创建表employees
create table employees like employees.employees;
-- 将employees库的employees表数据插入到自己的表
insert into employees
select * from employees.employees limit 0,10;
-- 新增数据,生日为闰年1972-02-29
insert into employees
select '10011','1972-02-29','Jiang','David','M','1990-2-20';


4. 查询用户和出生信息

语句:

-- 查询用户和出生信息
select concat(e.last_name, '  ', e.first_name) as Name, e.birth_date as BirthDate from employees e;


查询结果:



5. 实现

  5.1 查询当前日期、当前日期和生日间隔的年数。

代码:

select concat(e.last_name, '  ', e.first_name) as Name,
e.birth_date  as BirthDay,
(year(now())-year(e.birth_date)) diff,
now() as today
from employees e


结果:

      


        

[b]  5.2 查询当年的生日和下一年的生日。[/b]

代码:

select name,birthday,today,
date_add(birthday, interval diff year) curr, -- 当年生日
date_add(birthday, interval diff+1 year) next -- 下一年生日
from (
select concat(e.last_name, ' ', e.first_name) as Name, e.birth_date as BirthDay, (year(now())-year(e.birth_date)) diff, now() as today from employees e
) as a


查询结果

      


   [b]5.3 出生日期是29日,当年或下一年生日是28日,就将生日日期加1天[/b]

代码:

select name,birthday,today,
date_add(curr, interval if(day(birthday)=29 && day(curr)=28, 1, 0) day) as cur, -- 闰年运行后的当年生日
date_add(next, interval if(day(birthday)=29 && day(next)=28, 1, 0) day) as next -- 闰年运行后的下一年生日
from (
select name,birthday,today,
date_add(birthday, interval diff year) curr, -- 当年生日
date_add(birthday, interval diff+1 year) next -- 下一年生日
from (
select concat(e.last_name, ' ', e.first_name) as Name, e.birth_date as BirthDay, (year(now())-year(e.birth_date)) diff, now() as today from employees e
) as a
) as b


查询结果:

      


[b]  5.4 最终代码,如果当年生日已经过了就返回下一年生日。[/b]

代码:

select name,birthday,
if(cur>today, cur, next) as birth_day -- 如果当年生日大于当前日期,生日为今年,否则为下一年
from(
select name,birthday,today,
date_add(curr, interval if(day(birthday)=29 && day(curr)=28, 1, 0) day) as cur, -- 闰年运行后的当年生日
date_add(next, interval if(day(birthday)=29 && day(next)=28, 1, 0) day) as next -- 闰年运行后的下一年生日
from (
select name,birthday,today,
date_add(birthday, interval diff year) curr, -- 当年生日
date_add(birthday, interval diff+1 year) next -- 下一年生日
from (
select concat(e.last_name, ' ', e.first_name) as Name, e.birth_date as BirthDay, (year(now())-year(e.birth_date)) diff, now() as today from employees e
) as a
) as b
) as c


查询结果:

      


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: