mysql编程之生日问题

来源:互联网 发布:路由器端口转发是什么 编辑:程序博客网 时间:2024/04/29 22:09
  • 关于mysql的编程,很看重逻辑思维,如果不能理清思路,那么很难写出要实现的逻辑代码。今天学到了关于日期的经典sql编程问题中的生日问题,算是一个入门案例,看看它时如何一步步实现最终的结果。
  • 描述:生日,也就是存储的一个日期,其中有一个特殊的日子需要特殊对待,那就是闰月处理。比如有个伙计实在是倒霉,出生在了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)AS c

结果:
这里写图片描述
这里写图片描述

原创粉丝点击