[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,录入测试数据
把Step#2中的SQL的NOW()改成‘2014-02-28 00:10:10‘来进行测试,确实没有包括2月29日生日的同事,如下所示:
5.4.1 准备判断是否闰年的SQL
5.4.2 准备SQL语句
把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天之内的范畴,执行结果如下所示:
把Step#2中的SQL的NOW()改成‘2004-02-28 00:10:10‘来进行测试,SQL如下所示:
PS:因为2月29日在当年存在,所以算这5天之内的范畴,执行结果如下所示: