標籤:
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》
-- 建立表employeescreate table employees like employees.employees;-- 將employees庫的employees表資料插入到自己的表insert into employees select * from employees.employees limit 0,10;-- 新增資料,生日為閏年1972-02-29insert 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 todayfrom employees e
- 結果:
5.2 查詢當年的生日和下一年的生日。
-
- 代碼:
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
- 查詢結果
5.3 出生日期是29日,當年或下一年生日是28日,就將生日日期加1天
-
- 代碼:
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
- 查詢結果:
5.4 最終代碼,如果當年生日已經過了就返回下一年生日。
-
- 代碼:
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
查詢結果:
MySql生日閏月處理