您的位置:首页 > 博客中心 > 数据库 >

[MySQL]-->查询5天之内过生日的同事中的闰年2月29日问题的解决过程

时间:2022-03-13 23:15

前言:

上次写了查询5天之内过生日的同事中的跨年问题的解决过程,网址为: ,其中漏了一个闰年2月29日生日的细节问题,现在补充一下这个问题的处理过程:

5,补充闰年判断

有朋友提醒,闰年2月29日生日的话,可能查询不到,想到确实没有考虑到这个特殊的日期。
5.1,准备测试数据SQL,包含1980-02-29这一天生日的朋友。
INSERT INTO ali_users  SELECT ‘Jeff‘,‘1980-02-29‘,‘13998786549‘ 
UNION ALL SELECT ‘WeiYa‘,‘1980-02-28‘,‘13998786549‘ 
UNION ALL SELECT ‘XiaoTeng‘,‘1980-03-01‘,‘13998786549‘ 
UNION ALL SELECT ‘HeSheng‘,‘1980-03-02‘,‘13998786549‘
UNION ALL SELECT ‘JingPan‘,‘1980-03-03‘,‘13998786549‘
UNION ALL SELECT ‘WuHong‘,‘1986-03-04‘,‘13998786549‘;

5.2,录入测试数据
  1. 5.3,执行原来的旧版本的SQL查询检查结果

    把Step#2中的SQL的NOW()改成‘2014-02-28 00:10:10‘来进行测试,确实没有包括2月29日生日的同事,如下所示:
    1. 5.4,先建立一个存储函数f_isleap_year判断当年年份是否是闰年
      5.4.1 准备判断是否闰年的SQL
      1. 存储函数执行如下图所示:
         gxlsystem.com,布布扣


        5.4.2 准备SQL语句

        1. 5.4.3 在非闰年的时候,验证闰年2月29日生日,选择2014年非闰年测试
          把Step#2中的SQL的NOW()改成‘2014-02-28 00:10:10‘来进行测试,SQL如下所示:
          SELECT * FROM ali_users WHERE 
          DATEDIFF(CAST(CONCAT(YEAR(‘2014-02-28 00:10:10‘),DATE_FORMAT(birthday,‘-%m-%d‘))AS DATE),CAST(DATE_FORMAT(‘2014-02-28 00:10:10‘,‘%y-%m-%d‘) AS DATE)) BETWEEN 0 AND 4
          OR/* or后面的是捎带解决跨年问题*/ 
          DATEDIFF(CAST(CONCAT(YEAR(‘2014-02-28 00:10:10‘)+1,DATE_FORMAT(birthday,‘-%m-%d‘))AS DATE),CAST(DATE_FORMAT(‘2014-02-28 00:10:10‘,‘%y-%m-%d‘) AS DATE)) BETWEEN 0 AND 4
          OR /*补充闰年2月29日的生日方法*/
          (
          f_not_leap_year(YEAR(‘2014-02-28 00:10:10‘)) 
          AND DATE_FORMAT(birthday,‘-%m-%d‘)=‘-02-29‘ 
          AND DATEDIFF(CAST(CONCAT(‘2000‘,DATE_FORMAT(birthday,‘-%m-%d‘))AS DATE),CAST(CONCAT(‘2000‘,DATE_FORMAT(‘2000-02-28 00:10:10‘,‘-%m-%d‘)) AS DATE)) 
          BETWEEN 0 AND 4
          );

          执行SQL检验成果,如果当天是2014-02-28,看到已经有2月29日的生日的同事被记录进来了,其实包含了2月28日、2月29日、3月1日、3月2日、3月3日、3月4日的生日的同事。
          PS:因为2月29日在当年不存在,所以不算这5天之内的范畴,执行结果如下所示:
          1. 5.4.4 在闰年的时候,验证闰年2月29日生日,选择2004年闰年测试
            把Step#2中的SQL的NOW()改成‘2004-02-28 00:10:10‘来进行测试,SQL如下所示:
            1. 执行SQL检验成果,如果当天是2004-02-28,看到已经有2月29日的生日的同事被记录进来了,其实包含了2月28日、2月29日、3月1日、3月2日、3月3日的生日的同事。
              PS:因为2月29日在当年存在,所以算这5天之内的范畴,执行结果如下所示:

热门排行

今日推荐

热门手游