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日
可以製作一個函式
這個函式可以計算下次生日的日期.
模擬資料如下,使用了數字輔助表建立資料.
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;
一開始我把問題想簡單了,就想用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日
-
select id,birthday,if(cur>today,cur,next) as target
-
from
-
(
-
select id,birthday,today,
-
date_add(cur,interval if(day(birthday)=29&&day(cur)=28,1,0) day) as cur,
-
date_add(next,interval if(day(birthday)=29&&day(next)=28,1,0) day) as next
-
from
-
(
-
select id,birthday,today,
-
date_add(birthday,interval diff year) as cur,
-
date_add(birthday,interval diff+1 year) as next
-
from
-
(
-
select id,birthday,(year(now())-year(birthday)) as diff,now() as today from t
-
) a
-
) b
- ) c;
可以製作一個函式
-
SET GLOBAL log_bin_trust_function_creators = 1;
-
delimiter $$
-
create function age(birthday datetime)
-
returns datetime
-
begin
-
return (
-
select if(cur>today,cur,next) as target
-
from
-
(
-
select birthday,today,
-
date_add(cur,interval if(day(birthday)=29&&day(cur)=28,1,0) day) as cur,
-
date_add(next,interval if(day(birthday)=29&&day(next)=28,1,0) day) as next
-
from
-
(
-
select birthday,today,
-
date_add(birthday,interval diff year) as cur,
-
date_add(birthday,interval diff+1 year) as next
-
from
-
(
-
select birthday,(year(now())-year(birthday)) as diff,now() as today from dual
-
) a
-
) b
-
) c
-
);
-
end$$
- delimiter ;
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29254281/viewspace-1372987/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- JavaScript根據出生日期計算年齡JavaScript
- 在 AI 的世界裡,年齡從來不是問題AI
- mysql怎麼查詢年齡段MySql
- js年齡限制最大最小日期,對閏年進行判斷JS
- 根據datetimepicker選擇的日期計算年齡
- 身份證之js獲取性別 年齡 出生日期JS
- 藍橋杯-日期問題
- 日期型別轉換問題型別
- 誰的年齡最小(結構體專題)結構體
- MySql 查詢某一天日期格式欄位走索引問題MySql索引
- ElementUI日期元件格式化問題UI元件
- 輸入某人出生日期,計算年齡和距60歲的天數
- MySQL 問題MySql
- 索尼稱將解決“遊戲成癮”問題 實施年齡限制、家長控制等遊戲
- JavaScript計算年齡JavaScript
- 中文年齡函式函式
- PHP計算年齡、PHP
- 1465: 誰的年齡最小(結構體專題)結構體
- 日期型別有問題,如何解決?型別
- 演算法學習之路|日期問題演算法
- Oracle日期型別操作幾個問題Oracle型別
- pg 中日期型的計算問題
- 關於日期計算的問題 (轉)
- 關於全問檢索按照日期的排序問題排序
- MySQL 除法問題MySql
- MySQL range問題MySql
- Oracle日期型別操作幾個問題(二)Oracle型別
- java中有關日期的顯示問題 (轉)Java
- MySQL 獲取當前日期及日期格式MySql
- mysql 轉義問題MySql
- MySQL死鎖問題MySql
- MySQL行號問題MySql
- MySQL大小寫問題MySql
- mysql常見問題MySql
- MySQL 常見問題MySql
- mysql亂碼問題MySql
- mysql的中文問題MySql
- mysql 遇到的問題MySql