mysql编程之生日问题
2017-05-28 17:13
225 查看
关于mysql的编程,很看重逻辑思维,如果不能理清思路,那么很难写出要实现的逻辑代码。今天学到了关于日期的经典sql编程问题中的生日问题,算是一个入门案例,看看它时如何一步步实现最终的结果。
描述:生日,也就是存储的一个日期,其中有一个特殊的日子需要特殊对待,那就是闰月处理。比如有个伙计实在是倒霉,出生在了2月29号,再比如他20年后,恰好在生日当天去网吧玩游戏,并且注册了一个账号,游戏为了回馈用户,会给用户注册的那天当做游戏的生日,并且每年那天都会送出一些不错的礼物,可是这伙计偏偏是在2月29注册的啊,四年一次对他来说岂不是很不公平,别人每年都能得到礼物,而他却要等四年。所以游戏公司想到了一个方案,那就是当你生日不是瑞年的时候,我给你算作是3月1号作为生日,到瑞年的时候你的生日依旧为2月29号。所以问题就出现了,怎样在mysql实现这一功能呢?
最能想到的是采用子查询嵌套的方法,我一个sql语句无法完成工作,那么我就多采用几个查询将问题解决
测试用表
第一步:我需要把他今年的生日显示出来,为此需要得到生日距今的时间间隔(year(now())-birth_date),当前时间(now())
第二步:在上一步的基础上,显示出今年的生日时间(date_add(birth_date)+时间间隔 year),明年生日(date_add(birth_date)+时间间隔+1 year)
第三步:判断出生日期是否为2月29,今年二月是否有29号
第四步:查询下一次生日
结果:
描述:生日,也就是存储的一个日期,其中有一个特殊的日子需要特殊对待,那就是闰月处理。比如有个伙计实在是倒霉,出生在了2月29号,再比如他20年后,恰好在生日当天去网吧玩游戏,并且注册了一个账号,游戏为了回馈用户,会给用户注册的那天当做游戏的生日,并且每年那天都会送出一些不错的礼物,可是这伙计偏偏是在2月29注册的啊,四年一次对他来说岂不是很不公平,别人每年都能得到礼物,而他却要等四年。所以游戏公司想到了一个方案,那就是当你生日不是瑞年的时候,我给你算作是3月1号作为生日,到瑞年的时候你的生日依旧为2月29号。所以问题就出现了,怎样在mysql实现这一功能呢?
最能想到的是采用子查询嵌套的方法,我一个sql语句无法完成工作,那么我就多采用几个查询将问题解决
测试用表
第一步:我需要把他今年的生日显示出来,为此需要得到生日距今的时间间隔(year(now())-birth_date),当前时间(now())
SELECT CONCAT(last_name,' ',first_name)AS NAME,birth_date AS birthday,(YEAR(NOW())-YEAR(birth_date))AS diff,NOW() AS today FROM employees
第二步:在上一步的基础上,显示出今年的生日时间(date_add(birth_date)+时间间隔 year),明年生日(date_add(birth_date)+时间间隔+1 year)
SELECT NAME,birthday,today,DATE_ADD(birthday,INTERVAL diff YEAR)AS cur,DATE_ADD(birthday,INTERVAL diff+1 YEAR)AS NEXT FROM( SELECT CONCAT(last_name,' ',first_name)AS NAME,birth_date AS birthday,(YEAR(NOW())-YEAR(birth_date))AS diff,NOW() AS today FROM employees)AS a
第三步:判断出生日期是否为2月29,今年二月是否有29号
SELECT NAME,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(cur)=28,1,0)DAY)AS NEXT FROM(SELECT NAME,birthday,today,DATE_ADD(birthday,INTERVAL diff YEAR)AS cur,DATE_ADD(birthday,INTERVAL diff+1 YEAR)AS NEXT FROM( SELECT CONCAT(last_name,' ',first_name)AS NAME,birth_date AS birthday,(YEAR(NOW())-YEAR(birth_date))AS diff,NOW() AS today FROM employees)AS a)AS b
第四步:查询下一次生日
SELECT NAME,birthday,IF(cur>today,NEXT,cur)AS birthday FROM(SELECT NAME,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(cur)=28,1,0)DAY)AS NEXT FROM(SELECT NAME,birthday,today,DATE_ADD(birthday,INTERVAL diff YEAR)AS cur,DATE_ADD(birthday,INTERVAL diff+1 YEAR)AS NEXT FROM( SELECT CONCAT(last_name,' ',first_name)AS NAME,birth_date AS birthday,(YEAR(NOW())-YEAR(birth_date))AS diff,NOW() AS today FROM employees)AS a)AS b)
4000
AS c
结果:
相关文章推荐
- MySQL编程(0) - Mysql中文乱码问题解决方案
- 编程查询mysql中文乱码问题
- 编程艺术家经典试题解读:猜生日问题
- MySQL Innodb事务编程问题和处理
- MYSQL经典SQL之生日问题
- 数据库编程细节问题 -- 获取关于mysql的基本信息
- SQL编程之生日问题
- 数据库编程细节问题 -- 4.mysql读取大文件 (Blob)
- qt与mysql编程注意问题
- 编程艺术家经典试题解读:猜生日问题
- SQL编程之生日问题
- mysql最近生日问题SQL
- 怎么才是喜欢编程(18问题)------转载自http://www.vchelp.net
- 三菱PLC FX系列编程口通信的若干问题
- 把m文件编程dll文件的问题---from mathworks
- tomcat 5.X 的mysql DBCP配置指南及相关问题小结
- WINDOWS编程入门一个初级问题的分析
- Java 编程技术中汉字问题的分析及解决
- Delphi 编程中遇到的怪问题
- 金山软件论坛 - 综合交流区 - 系统+软件+编程 - 『网友常见问题及解答』