1. 科普下润年:

①、非整百年能被4整除的为闰年。(如2004年就是闰年,2100年不是闰年)
②、整百年能被400整除的是闰年。(如2000年是闰年,1900年不是闰年)
 
2. 例:
例如:当前日期是2016年8月21日,有人出生在1972年2月29日,查询后该用户最近的生日应该是2017年3月1日(非闰年)。如果当前日期是2016年1月20日,那么查询后应该返回2016年2月29日(闰年)。
 
3. 初始数据

先安装mysql官方示例数据库employees。没安装的可以参考:《MAC安装MYSQL官方示例数据库EMPLOYEE

  • 脚本操作:
-- 创建表employees
create table employees like employees.employees;
-- 将employees库的employees表数据插入到自己的表
insert into employees
select * from employees.employees limit ,;
-- 新增数据,生日为闰年1972-02-29
insert into employees
select '','1972-02-29','Jiang','David','M','1990-2-20';

4. 查询用户和出生信息

  • 语句:
-- 查询用户和出生信息
select concat(e.last_name, ' ', e.first_name) as Name, e.birth_date as BirthDate from employees e;
  • 查询结果:

5. 实现

  5.1 查询当前日期、当前日期和生日间隔的年数。

    • 代码:
    • select concat(e.last_name, '  ', e.first_name) as Name,
      e.birth_date as BirthDay,
      (year(now())-year(e.birth_date)) diff,
      now() as today
      from employees e
    • 结果:

      

        

  5.2 查询当年的生日和下一年的生日。

    • 代码:

      select name,birthday,today,
      date_add(birthday, interval diff year) curr, -- 当年生日
      date_add(birthday, interval diff+ year) next -- 下一年生日
      from (
      select concat(e.last_name, ' ', e.first_name) as Name,
      e.birth_date as BirthDay,
      (year(now())-year(e.birth_date)) diff,
      now() as today
      from employees e
      ) as a
    • 查询结果

      

   5.3 出生日期是29日,当年或下一年生日是28日,就将生日日期加1天

    • 代码:

      select name,birthday,today,
      date_add(curr, interval if(day(birthday)= && day(curr)=, , ) day) as cur, -- 闰年运行后的当年生日
      date_add(next, interval if(day(birthday)= && day(next)=, , ) day) as next -- 闰年运行后的下一年生日
      from (
      select name,birthday,today,
      date_add(birthday, interval diff year) curr, -- 当年生日
      date_add(birthday, interval diff+ year) next -- 下一年生日
      from (
      select concat(e.last_name, ' ', e.first_name) as Name,
      e.birth_date as BirthDay,
      (year(now())-year(e.birth_date)) diff,
      now() as today
      from employees e
      ) as a
      ) as b
    • 查询结果:

      

  5.4 最终代码,如果当年生日已经过了就返回下一年生日。

    • 代码:

      select name,birthday,
      if(cur>today, cur, next) as birth_day -- 如果当年生日大于当前日期,生日为今年,否则为下一年
      from(
      select name,birthday,today,
      date_add(curr, interval if(day(birthday)= && day(curr)=, , ) day) as cur, -- 闰年运行后的当年生日
      date_add(next, interval if(day(birthday)= && day(next)=, , ) day) as next -- 闰年运行后的下一年生日
      from (
      select name,birthday,today,
      date_add(birthday, interval diff year) curr, -- 当年生日
      date_add(birthday, interval diff+ year) next -- 下一年生日
      from (
      select concat(e.last_name, ' ', e.first_name) as Name,
      e.birth_date as BirthDay,
      (year(now())-year(e.birth_date)) diff,
      now() as today
      from employees e
      ) as a
      ) as b
      ) as c
    • 查询结果:

      

  

MySql生日闰月处理的更多相关文章

  1. mysql--SQL编程(关于mysql中的日期,实例,判断生日是否为闰年) 学习笔记2.1

    关于日期处理的实例: 从mysql给出的 example 这个是官方源码下载以及导入,http://dev.mysql.com/doc/employee/en/employees-installati ...

  2. [MySQL]-->询5 几天之内解决在新年发行一个同事的生日过程

    前言:        遇到朋友提问,例如以下:SELECT * FROM ali_users WHERE  DATEDIFF(CAST(CONCAT(DATE_FORMAT(NOW(),'%y'),D ...

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

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

  4. mysql 年龄计算(根据生日字段)

    mysql 年龄计算(根据生日字段) year( from_days( datediff( now( ), birthdate))) //获取年龄 now() 当前时间,精确到秒 datediff(b ...

  5. mysql 计算生日

    生日(DATE) 计算方法1: YEAR(CURDATE())-YEAR(birthday)-(RIGHT(CURDATE(),5)<RIGHT(birthday,5)) 计算方法2: year ...

  6. MySql查询生日的两种方式

    需要是要查询日期段内过生日的会员,分为两种情况: 1. 不跨年 例如: 查询2017-01-01到2017-01-20之间过生日的会员  (假定今天是2017-01-01则这种也可以描述为20天内过生 ...

  7. MySQL - 统计每个月生日的人数

    Person表定义如下: create table person(id int primary key auto_increment, birthday datetime); Person 数据如下: ...

  8. mysql 年龄计算(根据生日)

    生日(DATE) 计算方法1: ))) 计算方法2: year( from_days( datediff( now( ), birthdate))) now() 当前时间,精确到秒 datediff( ...

  9. mysql从身份证号中提取生日、性别

    SELECT p.ID, p.IDCardNo, IF ( LENGTH(p.IDCardNo) , CAST( , ) AS DATETIME ), CAST( CONCAT( ', , ) ) A ...

随机推荐

  1. Java问题总结

    1.如何查看使用java的版本 cmd-->java -version 2.如何下载jdk,sdk Java.JDK(工具包)的安装_百度经验http://jingyan.baidu.com/a ...

  2. 【 D3.js 入门系列 --- 2.1 】 关于如何选择,插入,删除元素

    在D3.js中,选择元素的函数有两个:select 和 selectAll . 先说明一下它们的区别: select 是选择所有指定元素的第一个 selectAll 是选择指定元素的全部(以用于后面同 ...

  3. Codeforces Round #158 (Div. 2)

    A. Adding Digits 枚举. B. Ancient Prophesy 字符串处理. C. Balls and Boxes 枚举起始位置\(i\),显然\(a_i \le a_j, 1 \l ...

  4. *** glibc detected *** malloc(): memory corruption 分类: C/C++ Linux 2015-05-14 09:22 37人阅读 评论(0) 收藏

    *** glibc detected *** malloc(): memory corruption: 0x09eab988 *** 发现是由于memset越界写引起的. 在Linux Server上 ...

  5. python 列表操作

    列表的基本操作示例展示: append 功能:列表追加元素 name = ['sd','dfdf','drer'] name.append('sdsd') 返回结果:name ['sd', 'dfdf ...

  6. 在Windows上,迁移VisualSVN server

    最近在搭建自动化测试框架,顺便了解了一下SVN的搭建.对于一般的使用场景,VisualSVN还是挺方便的,而且上手特别快. 由于是第一个demo,后期要迁移到其他服务器上面,所以就熟悉了一下serve ...

  7. IIS7错误:不能在此路径中使用此配置节。如果在父级别上锁定了该节,便会出现这种情况。锁定是默认设置的(overrideModeDefault="Deny")......

    不能在此路径中使用此配置节.如果在父级别上锁定了该节,便会出现这种情况.锁定是默认设置的(overrideModeDefault="Deny")...... 解决方案: 因为 II ...

  8. .net中常用的几种页面间传递参数的方法

    转自:http://www.cnblogs.com/lxshanye/archive/2013/04/11/3014207.html 参考:http://www.cnblogs.com/zhangka ...

  9. Win7打补丁以后vs2012突然出现的程序版本不兼容问题

    装这个: Update for Microsoft Visual Studio 2012 (KB2781514) http://www.microsoft.com/en-us/download/det ...

  10. 解决php的“It is not safe to rely on the system’s timezone settings”问题

    PHP调试的时候出现了警告: It is not safe to rely on the system解决方法,其实就是时区设置不正确造成的,本文提供了3种方法来解决这个问题. 实 际上,从PHP 5 ...