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
结果:
阅读全文
0 0
- mysql编程之生日问题
- SQL编程之生日问题
- MYSQL经典SQL之生日问题
- mysql最近生日问题SQL
- 【数学题】概率问题之-学生的生日
- 生日问题
- 编程艺术家经典试题解读:猜生日问题
- MySQL 取生日段
- mysql里筛选生日
- mysql 生日提醒
- 生日悖论问题
- 猜生日问题
- 生日问题(java)
- HDU4551 猜生日问题
- 生日蜡烛问题
- 问题 : 相同生日
- 成佩涛编程之路——MySQL除法精度问题
- ACM之生日相同
- 数据结构二叉树线索化
- spring-依赖注入
- Can you answer these queries?
- L先生与解密
- mysql查询时,offset过大影响性能的原因与优化方法
- mysql编程之生日问题
- java基础篇(六)——三大特性之继承
- Java安全组成、包及第三方扩展
- 我为什么从SVN转向GIT
- QT编写的数独求解软件、一个数独快速高效的求解算法
- 启动zuul不需要配置地址映射就可以找到服务
- 不晚
- React-Native之仿携程App首页布局
- 建模笔记1(杂)