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

前言:

上次写了查询5天之内过生日的同事中的跨年问题的解决过程,网址为:http://blog.csdn.net/mchdba/article/details/38952033 ,其中漏了一个闰年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,录入测试数据mysql> use test;

Reading table information for completion of table and column names

You can turn off this feature to get a quicker startup with -A

Database changed

mysql> INSERT INTO ali_users SELECT \'Jeff\',\'1980-02-29\',\'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\';

Query OK, 5 rows affected (0.00 sec)

Records: 5 Duplicates: 0 Warnings: 0

mysql>

5.3,执行原来的旧版本的SQL查询检查结果

把Step#2中的SQL的NOW()改成'2014-02-28 00:10:10'来进行测试,确实没有包括2月29日生日的同事,如下所示:

mysql> 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

-> ;

+----------+------------+-------------+

| username | birthday | iphone |

+----------+------------+-------------+

| XiaoTeng | 1980-03-01 | 13998786549 |

| HeSheng | 1980-03-02 | 13998786549 |

| JingPan | 1980-03-03 | 13998786549 |

| WuHong | 1986-03-04 | 13998786549 |

+----------+------------+-------------+

4 rows in set, 2 warnings (0.00 sec)

mysql>

5.4,先建立一个存储函数f_isleap_year判断当年年份是否是闰年

5.4.1 准备判断是否闰年的SQLDELIMITER $$

USE `test`$$

DROP FUNCTION IF EXISTS `f_not_leap_year`$$

CREATE FUNCTION `f_not_leap_year`(p_year BIGINT) RETURNS BOOLEAN

BEGIN

/*是闰年则返回0(false),不是闰年则返回1(true)*/

DECLARE v_flag INT DEFAULT 0;

/*①、普通年能被4整除且不能被100整除的为闰年。(如2004年就是闰年,1901年不是闰年)*/

IF (p_year%4)=0 AND (p_year%100)>0 THEN

SET v_flag=0;

/*②、世纪年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年) */

ELSEIF (p_year%400)=0 THEN

SET v_flag=0;

/*③、对于数值很大的年份,这年如果能整除3200,并且能整除172800则是闰年。如172800年是闰年,

86400年不是闰年(因为虽然能整除3200,但不能整除172800)(此按一回归年365天5h48\'45.5\'\'计算)。

*/

ELSEIF (p_year%3200)=0 AND (p_year%172800)=0 THEN

SET v_flag=0;

ELSE

SET v_flag=1;

END IF;

RETURN v_flag;

END$$

DELIMITER ;

存储函数执行如下图所示:

5.4.2 准备SQL语句

SELECT * FROM ali_users WHERE

DATEDIFF(CAST(CONCAT(YEAR(NOW()),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(NOW(),\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4

OR/* or后面的是捎带解决跨年问题*/

DATEDIFF(CAST(CONCAT(YEAR(NOW())+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(NOW(),\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4

OR /*补充闰年2月29日的生日问题*/

(

f_not_leap_year(YEAR(NOW()))

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(NOW(),\'-%m-%d\')) AS DATE))

BETWEEN 0 AND 4

);

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天之内的范畴,执行结果如下所示:mysql> 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

-> );

+----------+------------+-------------+

| username | birthday | iphone |

+----------+------------+-------------+

| Jeff | 1980-02-29 | 13998786549 |

| XiaoTeng | 1980-03-01 | 13998786549 |

| HeSheng | 1980-03-02 | 13998786549 |

| JingPan | 1980-03-03 | 13998786549 |

| WuHong | 1986-03-04 | 13998786549 |

| WeiYa | 1980-02-28 | 13998786549 |

+----------+------------+-------------+

6 rows in set, 2 warnings (0.00 sec)

mysql>5.4.4 在闰年的时候,验证闰年2月29日生日,选择2004年闰年测试把Step#2中的SQL的NOW()改成'2004-02-28 00:10:10'来进行测试,SQL如下所示:SELECT * FROM ali_users WHERE

DATEDIFF(CAST(CONCAT(YEAR(\'2004-02-28 00:10:10\'),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2004-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4

OR/* or后面的是捎带解决跨年问题*/

DATEDIFF(CAST(CONCAT(YEAR(\'2004-02-28 00:10:10\')+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2004-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4

OR /*补充闰年2月29日的生日方法*/

(

f_not_leap_year(YEAR(\'2004-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(\'2004-02-28 00:10:10\',\'-%m-%d\')) ASDATE))

BETWEEN 0 AND 4

);

执行SQL检验成果,如果当天是2004-02-28,看到已经有2月29日的生日的同事被记录进来了,其实包含了2月28日、2月29日、3月1日、3月2日、3月3日的生日的同事。

PS:因为2月29日在当年存在,所以算这5天之内的范畴,执行结果如下所示:

mysql> SELECT * FROM ali_users WHERE

-> DATEDIFF(CAST(CONCAT(YEAR(\'2004-02-28 00:10:10\'),DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2004-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4

-> OR/* or后面的是捎带解决跨年问题*/

-> DATEDIFF(CAST(CONCAT(YEAR(\'2004-02-28 00:10:10\')+1,DATE_FORMAT(birthday,\'-%m-%d\'))AS DATE),CAST(DATE_FORMAT(\'2004-02-28 00:10:10\',\'%y-%m-%d\') AS DATE)) BETWEEN 0 AND 4

-> OR /*补充闰年2月29日的生日方法*/

-> (

-> f_not_leap_year(YEAR(\'2004-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(\'2004-02-28 00:10:10\',\'-%m-%d\')) AS DATE))

-> BETWEEN 0 AND 4

-> );

+----------+------------+-------------+

| username | birthday | iphone |

+----------+------------+-------------+

| Jeff | 1980-02-29 | 13998786549 |

| XiaoTeng | 1980-03-01 | 13998786549 |

| HeSheng | 1980-03-02 | 13998786549 |

| JingPan | 1980-03-03 | 13998786549 |

| WeiYa | 1980-02-28 | 13998786549 |

+----------+------------+-------------+

5 rows in set (0.00 sec)

mysql>

2月29日过生日的人,不在闰年怎过生日?

一般都过阴历,或者2月28日过

如果一个人出生在闰年的2月29日,那他怎过生日?

你好,那就过2月29日啊,不可能没润月就不过了吧

http://www.htsjk.com/shujukunews/2979.html

www.htsjk.Com

true

http://www.htsjk.com/shujukunews/2979.html

NewsArticle

[MySQL]--查询5天之内过生日的同事中的闰年2月29日问题的解决过程,mysql闰年 前言: 上次写了 查询5天之内过生日的同事中的跨年问题的解决过程 ,网址为:http://blog.csdn.net/mchdba/articl...

本站文章为和通数据库网友分享或者投稿,欢迎任何形式的转载,但请务必注明出处.

同时文章内容如有侵犯了您的权益,请联系QQ:970679559,我们会在尽快处理。

相关文章

暂无相关文章

mysql 闰年,[MySQL]--gt;查询5天之内过生日的同事中的闰年2月相关推荐

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

    前言: 上次写了查询5天之内过生日的同事中的跨年问题的解决过程,网址为:http://blog.csdn.net/mchdba/article/details/38952033 ,当中漏了一个闰年2月 ...

  2. 查询七天之内所有生日的客户

    这里并没有考虑跨年的问题(跨年问题正在解决中) SELECT sysctr.csr_birthday AS '生日', usr.user_title AS '登录名', sysctr.csr_name ...

  3. MySQL入门系列:查询简介(四)之类型转换和分组查询

    前文回顾 之前我们介绍了一些简单查询的方式以及MySQL中表达式和函数的简单使用,本篇文章继续介绍如何使用MySQL进行查询. 类型转换 类型转换的场景 只要某个值的类型与上下文要求的类型不符,MyS ...

  4. mysql 查询1小时内_mysql查询一个小时之内的数据

    由于项目的需要经常查询一个小时之内的数据,接下来吾爱编程为大家分享一下使用Mysql查询一个小时之内的数据的sql,有需要的小伙伴可以参考一下: 1.方法一: (1).sql写法: SELECT *  ...

  5. mysql数据库多表查询(内连接,外连接,自连接,子查询及案例分析)

    mysql数据库多表查询 之前接触的项目或者自己涉及的部分对于多表查询的使用都比较的少,常常是自己更具案例进行学习,最近见到的比较的多,所以今天就好好的总结一下,为下一步学习做准备! 1.多表查询关系 ...

  6. mysql所有班级名称和人数_mysql数据库优化课程---12、mysql嵌套和链接查询(查询user表中存在的所有班级的信息?)...

    mysql数据库优化课程---12.mysql嵌套和链接查询(查询user表中存在的所有班级的信息?) 一.总结 一句话总结: in:distinct:select * from class wher ...

  7. mysql======基本的数据查询(1)

    mysql 练习题 ***创建student表 mysql> create table student ( -> id int(10) not null unique primary ke ...

  8. MySQL Sending data导致查询很慢的问题详细分析

    这两天帮忙定位一个MySQL查询很慢的问题,定位过程综合各种方法.理论.工具,很有代表性,分享给大家作为新年礼物:) [问题现象] 使用sphinx支持倒排索引,但sphinx从mysql查询源数据的 ...

  9. php 多条查询结果插入新表,Mysql应用MySQL查询结果复制到新表的方法(更新、插入)...

    <Mysql应用MySQL查询结果复制到新表的方法(更新.插入)>要点: 本文介绍了Mysql应用MySQL查询结果复制到新表的方法(更新.插入),希望对您有用.如果有疑问,可以联系我们. ...

  10. python连接MySQL并进行数据查询

    python连接MySQL并进行数据查询 #建立数据库的连接 mydb = mysql.connector.connect(host="0.0.0.0",user="ro ...

最新文章

  1. linux mysql udf渗透测试
  2. 相关算子、卷积算子、边缘效应
  3. 深入理解计算机系统 系统软件 硬件 文件 进程 虚拟内存
  4. server正式的环境性能测试nginx-php 指着寻求突破的表现
  5. 二十三、 爬取mzsock网站写真社区
  6. 使用PYTORCH复现ALEXNET实现猫狗识别
  7. openshift_红帽Openshift:入门–云中的Java EE6
  8. 那些一眼就被看出包装过的简历
  9. overflow+文档流
  10. python中当地时间_Python 日期和时间
  11. error: #error This file requires compiler and library support for the ISO C++ 2011 standard.
  12. 【渝粤教育】电大中专跨境电子商务理论与实务 (8)作业 题库
  13. 你连 HTTPS 原理都不懂,还讲“中间人攻击”?
  14. jmp怎么做合并的箱线图_Python数据可视化:箱线图多种库画法
  15. java正则卡号4位一空格_银行卡号每隔4位插入空格
  16. 教你如何不登陆复制CSDN代码
  17. 利用抓包思想实现“优雅”请假
  18. 技术选型Rust——事后分析
  19. 2021-10-01 REDIS全网最超级详细
  20. 洛谷 P1095 守望者的逃离

热门文章

  1. java instant_Java Instant类
  2. TangIDE游戏开发之70行代码实现打地鼠
  3. 汽车IC TPS7A6633QDGNRQ1应用 低压降线性稳压器
  4. java string 深拷贝_探讨java深拷贝
  5. 计算机软件网络工程师考试试题,计算机软件水平考试《网络工程师》试题及答案(6)...
  6. 深度学习(图像处理): A neural algorithm of artistic style算法详解
  7. 生成万花筒效果并截图
  8. TPM设备管理学习心得
  9. 关于手机天气应用中的城市搜索的联想查找方式优化
  10. python 实时打印控制台输出信息