码迷,mamicode.com
首页 > 数据库 > 详细

在MySQL查询中计算一个人的年龄——续

时间:2018-09-29 14:22:18      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:archive   日历   cat   技术   curd   函数   轻松   个人   它的   

DATE_ADD来救援


MySQL知道如何使用Gregorian日历,我相信让MySQL更容易完成工作,而不是试图弄清楚如何实现不同的情况。我选择实施“月末最后一天”技术。在这种情况下,我们将通过创建基于当年3月1日的mysql日期,并从中减去一天来到达2月的最后一天。

如果您使用mysql日期函数阅读我的文章“查找下一个星期一”,您会看到如何使用DATE_ADD()来帮助解决许多问题,即使在您实际使用它减去时该名称可能会产生误导。使用以下测试日期证明mysql已经完全实现了闰年逻辑:


mysql > 选择 DATE_ADD (‘2011-03-01‘,INTERVAL -1 DAY  ; 
+ ----------------------------------------- + 
DATE_ADD (‘2011-03-01‘,INTERVAL -1 DAY ) | 
+ ----------------------------------------- + 
| 2011 -02- 28                              | 
+ ----------------------------------------- + 
1中 集合 (0.00

mysql > 选择 DATE_ADD (‘2012-03-01‘,INTERVAL -1 DAY  ; 
+ ----------------------------------------- + 
DATE_ADD (‘2012-03-01‘,INTERVAL -1 DAY ) | 
+ ----------------------------------------- + 
| 2012 -02- 29                              | 
+ ----------------------------------------- + 
1中 集合 (0.00

mysql > 选择 DATE_ADD (‘2000-03-01‘,INTERVAL -1 DAY  ;  
+ ----------------------------------------- + 
DATE_ADD (‘2000-03-01‘,INTERVAL -1 DAY ) | 
+ ----------------------------------------- + 
| 2000 -02- 29                              | 
+ ----------------------------------------- + 
1中 集合 (0.00

mysql > 选择 DATE_ADD (‘1900-03-01‘,INTERVAL -1 DAY  ;    
+ ----------------------------------------- + 
DATE_ADD (‘1900-03-01‘,间隔-1 DAY ) | 
+ ----------------------------------------- + 
| 1900 -02- 28                              | 
+ ----------------------------------------- + 
1中 集合 (0.00
 


所以我们需要做的是使用CONCAT()构建正确的字符串以传递给DATE_ADD,我们可以使用YEAR()和我们的硬连线3月1日轻松完成。


SELECT CONCAT  YEAR  CURDATE ())‘ - 03-01‘ ) ; 
+ ----------------------------------- + 
CONCAT  YEAR  CURDATE ())‘-03-01‘ ) | 
+ ----------------------------------- + 
| 2011年 03                         月1日
+ ----------------------------------- + 
1中 集合 (0.00
 


这将始终生成相当于当年3月1日的有效mysql日期字符串。现在我们将它替换为DATE_ADD()函数:


SELECT DATE_ADD  CONCAT  YEAR  CURDATE ())‘ - 03-01‘ ),INTERVAL -1 DAY  ; 
+ ------------------------------------------------- ------------- + 
DATE_ADD  CONCAT  YEAR  CURDATE ())‘-03-01‘ ),间隔-1 DAY ) | 
+ ------------------------------------------------- ------------- + 
| 2011 -02- 28                                                   | 
+ ------------------------------------------------- ------------- + 
1中 集合 (0.00
 


当我们在查询中实际使用它时,我们只需要DAY():


SELECT DAY  DATE_ADD  CONCAT  YEAR  CURDATE ())‘ - 03-01‘ ),INTERVAL -1 DAY )) ; 
+ ------------------------------------------------- ------------------ + 
DAY  DATE_ADD  CONCAT  YEAR  CURDATE ())‘-03-01‘ ),间隔-1 DAY )) |
+ ------------------------------------------------- ------------------ + 
|                                                                28 | 
+ ------------------------------------------------- ------------------ +
 


然后我们需要添加一个条件,因此如果用户的生日是2月29日,我们只返回此计算。


SELECT *,IF 个月生日 = 2和日生日 = 29‘飞跃‘‘正常‘ ) 为弹跳FROM用户; 
+ ---- + --------- + ------------ + -------- + 
| id | 名字     生日   leaper 
+ ---- + --------- + ------------ + -------- + 
|  1 | 弗兰     | 1967 - 10 - 31 | 正常
|  2 | 比尔     | 1964年 - 05 - 07年正常
|  3 | 吉米   | 1965 -04- 27 | 正常
|  4 | Stacy   | 2002 - 11 - 30 | 正常
|  5 | 乔治   | 2007 - 10 - 25 | 正常
|  6 | Leapie   | 2008 -02-29 | 飞跃   
|  7 | BadLeap 0000-00-00 正常
+ ---- + --------- + ------------ + -------- + 
7中 集合 (0.00
 


由于我们可以看到我们的条件正常工作,剩下的就是插入适当的函数来代替‘Leap‘和‘Normal‘。跳跃将是我们的“3月1日前一天”计算,而“正常”将是原始的DAY(生日)。完成后它可能看起来很神秘,但你可以把它分解成它的组成部分,正如我在本文中所展示的那样,并且希望很明显你可以使用mysql在需要时使用一系列简单的函数来解决相对复杂的问题三元函数。


SELECT *, YEAR  CURDATE ()) - 
  YEAR 出生日期) - 
     IF ( STR_TO_DATE  CONCAT  YEAR  CURDATE ()), ‘ - ‘ ,生日), ‘ - ‘ , 
       IF (个月生日) = 2 和 DAY 生日) = 29 , 
         DAY DATE_ADD  CONCAT  YEAR  CURDATE ()), ‘-03-01‘ ) INTERVAL 1 DAY         DAY 出生日期‘%Y-%C-%E‘ > CURDATE AS年龄FROM用户; 

      

 



+ ---- + --------- + ------------ + ------ + 
| id | 名字     生日   年龄   
+ ---- + --------- + ------------ + ------ + 
|  1 | 弗兰     | 1967 - 10 - 31 |   43 | 
|  2 | 比尔     | 1964年 - 05 - 07年|   47 | 
|  3 | 吉米   | 1965 -04- 27 |   46 | 
|  4 | Stacy   | 2002 - 11 - 30 |    8 | 
|  5 | 乔治   | 2007 - 10 - 25 |    3 | 
|  6 | Leapie   | 2008 -02- 29 |    3 | 
|  7 | BadLeap 0000-00-00 | 2011 | 
+ ---- + --------- + ------------ + ------ + 
7中 集合 (0.00
 


测试边缘情况



有点难以证明这对我们的边缘情况实际上是正确的,所以我们必须人为地用闰年代替curdate()来测试它,这很烦人但是必要。搜索和替换肯定有帮助。


SELECT *,YEAR (‘2011-02-28‘ ) - 
YEAR 出生日期 - 
IF  STR_TO_DATE  CONCAT  YEAR (‘2011-02-28‘ ) ‘ - ‘,MONTH 出生日期‘ - ‘
IF 个月生日 = 2和日生日 = 29
DAY  DATE_ADD  CONCAT YEAR (‘2011-02-28‘ ) ‘-03-01‘ ),INTERVAL -1DAY ))
DAY 出生日期))
‘%Y-%C-%E‘ ) > “2011-02 -28‘10 ) 
AS年龄FROM用户,其中,ID = 6 ; 
+ ---- + -------- + ------------ + ------ + 
| id | 名字   生日   年龄   
+ ---- + -------- + ------------ + ------ + 
|  6 | Leapie | 2008 -02- 29 |    3 | 
+ ---- + -------- + ------------ + ------ + 
1中 集合 (0.00
 


这表明即使日期是非闰年的第28天,计算也正确地确定它应该被视为用户的生日。

那么2012年是闰年呢?


SELECT *,YEAR (‘2012-02-28‘ ) - 
YEAR 出生日期 - 
IF  STR_TO_DATE  CONCAT  YEAR (‘2012-02-28‘ ) ‘ - ‘,MONTH 出生日期‘ - ‘
IF 个月生日 = 2和日生日 = 29
DAY  DATE_ADD  CONCAT YEAR (‘2012-02-28‘ ) ‘-03-01‘ ),INTERVAL -1DAY ))
DAY 出生日期))
‘%Y-%C-%E‘ ) > “2012-02 -28‘10 ) 
AS年龄FROM用户,其中,ID = 6 ; 
+ ---- + -------- + ------------ + ------ + 
| id | 名字   生日   年龄   
+ ---- + -------- + ------------ + ------ + 
|  6 | Leapie | 2008 -02- 29 |    3 | 
+ ---- + -------- + ------------ + ------ + 
1中 集合 (0.00
 


它正确地确定‘Leapie‘仍然是3!第二天,Leapie享受闰年生日派对:


SELECT *,YEAR (‘2012-02-29‘ ) - 
YEAR 出生日期 - 
IF  STR_TO_DATE  CONCAT  YEAR (‘2012-02-29‘ ) ‘ - ‘,MONTH 出生日期‘ - ‘
IF 个月生日 = 2和日生日 = 29
DAY  DATE_ADD  CONCAT YEAR (‘2012-02-29‘ ) ‘-03-01‘ ),INTERVAL -1DAY ))
DAY 出生日期))
‘%Y-%C-%E‘ ) > “2012-02 -29‘10 ) 
AS年龄FROM用户,其中,ID = 6 ; 
+ ---- + -------- + ------------ + ------ + 
| id | 名字   生日   年龄   
+ ---- + -------- + ------------ + ------ + 
|  6 | Leapie | 2008 -02- 29 |    4 | 
+ ---- + -------- + ------------ + ------ + 
1中 集合 (0.00
 


概要


MySQL可用于自动计算任何一天的人的准确年龄,即使对于在闰年2月29日出生的人也是如此。它很快,并且允许您利用MySQL日期类型和相关功能的强大功能,这样您就不必在服务器端代码中执行这些计算。这是查询一次:


SELECT *, YEAR  CURDATE ()) - 
YEAR 出生日期) - 
IF ( STR_TO_DATE  CONCAT  YEAR  CURDATE ()), ‘ - ‘ ,生日), ‘ - ‘ , 
IF (个月生日) = 2 和 DAY 生日) = 29 , 
DAY DATE_ADD  CONCAT  YEAR  CURDATE ()), ‘-03-01‘ ) INTERVAL 1 DAY  DAY 出生日期‘%Y-%C-%E‘ > CURDATE AS年龄来自用户; 

在MySQL查询中计算一个人的年龄——续

标签:archive   日历   cat   技术   curd   函数   轻松   个人   它的   

原文地址:https://www.cnblogs.com/xjsp/p/9723249.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!