当前位置:  开发笔记 > 后端 > 正文

关于日期的经典SQL编程问题:生日问题

与日期相关的第一个问题是根据某个用户的出生日期和当前日期,计算他最近的生日。通过对这个问题的处理,演示如何通过使用日期函数来正确处理闰月。在生日问题中,一般对闰月的处理如下:如果是闰月,那么返...">

 

与日期相关的第一个问题是根据某个用户的出生日期和当前日期,计算他最近的生日。通过对这个问题的处理,演示如何通过使用日期函数来正确处理闰月。

  在生日问题中,一般对闰月的处理如下:如果是闰月,那么返回2月28日;如果不是闰月,则返回3月1日(大部分是出于法律的要求)。例如,当前的日期是2005年9月26日,有人出生在1972年2月29日,查询后返回的该用户最近的生日应该是2006年3月1日。如果当前是2007年9月26日,那么查询后应该返回2008年2月29日。

  在解决该问题之前,运行下列清单中的代码,初始化一些数据。在演示前,需要确认已经安装了MySQL官方的示例数据库employees。

USE test;

CREATE TABLE employees LIKE employees.employees;

INSERT INTO employees 
SELECT * FROM employees.employees LIMIT 10;

INSERT INTO employees 
SELECT 10011,'1972-02-29','Jiang','David','M','1990-2-20';

  这里人为地插入一个员工David Jiang,其出生日期为“1972-02-29”,闰月。运行如下语句得到所有员工的出生信息。

SELECT 
    CONCAT(last_name,' ',first_name) AS Name,
    birth_date AS BirthDay 
FROM employees;

  运行结果如下表所示。

关于日期的经典SQL编程问题:生日问题
▲每个员工的生日信息

  下面是该解决方案的SQL查询:

SELECT name,birthday,
       IF(cur>today, cur,next) AS birth_day
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(next)=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

  这个查询需要a、b、c三个子查询来完成。第一个子查询a用来计算每位员工的出生日期与当前日期相差的年份,以及当前的日期。如果只运行子查询a,将得到如下表所示的输出,假设当前的日期为“2011-02-04”。

关于日期的经典SQL编程问题:生日问题
▲子查询a的结果

  要计算某员工最近的生日,需要在BirthDay列加上Diff列的年数。如果结果大于当前日期,则年龄需要再加一年。子查询b增加两列即Cur和Next,这两列分别用于表示今年和明年的生日。注意,如果出生日期是2月29日,且目标日期不是闰月,那么这两列所包含的将是2月28日,而不是3月1日。子查询b的结果如下表所示。

关于日期的经典SQL编程问题:生日问题
▲子查询b的结果

  子查询c用来处理闰月的问题,如果出生的日期为闰月,并且当前的年份不是闰年,则日期加1,表示3月1日为生日。对下一个年份使用同样的操作,子查询c的结果如下表所示。

关于日期的经典SQL编程问题:生日问题
▲子查询c的结果

  最后判断今年的生日是否已过,如果是,则返回下一年的生日,最后得到的查询结果如下表所示。

关于日期的经典SQL编程问题:生日问题
▲最后得到的查询结果

  可以看到Maliniak Kyoichi今年的生日已过,下一个生日是2012年,而David Jiang的生日是3月1日。

  作者简介

  姜承尧(DavidJiang),《MySQL技术内幕:SQL编程》、《MySQL技术内幕:InnoDB存储引擎》作者,资深MySQL数据库专家,MySQL开源分支版本InnoSQL的创始人,独立数据库咨询顾问。不仅擅长于数据库的管理和维护,还擅长于数据库的开发,同时一直致力于MySQL数据库底层实现原理的研究和探索,对高性能数据库和数据仓库也有深刻而独到的理解。目前就职于网易研究院,担任后台技术中心技术经理一职,从事MySQL数据库底层以及云的相关的开发工作。


推荐阅读
  • Oracle Database 10g许可授予信息及高级功能详解
    本文介绍了Oracle Database 10g许可授予信息及其中的高级功能,包括数据库优化数据包、SQL访问指导、SQL优化指导、SQL优化集和重组对象。同时提供了详细说明,指导用户在Oracle Database 10g中如何使用这些功能。 ... [详细]
  • 本文介绍了关系型数据库和NoSQL数据库的概念和特点,列举了主流的关系型数据库和NoSQL数据库,同时描述了它们在新闻、电商抢购信息和微博热点信息等场景中的应用。此外,还提供了MySQL配置文件的相关内容。 ... [详细]
  • MySQL笔记_MySQL笔记1|数据库17问17答
    本文由编程笔记#小编为大家整理,主要介绍了MySQL笔记1|数据库17问17答相关的知识,希望对你有一定的参考价值。 ... [详细]
  • nsitionalENhttp:www.w3.orgTRxhtml1DTDxhtml1-transitional.dtd ... [详细]
  • 数据库基本介绍
    1、数据库基本知识概念:数据库:database(DB),是一种存储数据的仓库数据库是根据数据结构组织、存储和 ... [详细]
  • MySQL:互联网公司常用 分库分表
    本文目录一、数据库瓶颈IO瓶颈CPU瓶颈二、分库分表水平分库水平分表垂直分库垂直分表三、分库分表工具四、分库分表步骤五、分库分表问题非partit ... [详细]
  • 篇首语:本文由编程笔记#小编为大家整理,主要介绍了记录一次MySQL两千万数据的大表优化解决过程,提供三种解决方案相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 目录一、MySQL数据库1.简介2.用管理员身份登录3.密码相关操作4.SQL与NoSQL5.数据库重要概念二、MySQL基本语句1.基于库的增删改查2.基于表的增删改查3.基于记 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • 推荐一个ASP的内容管理框架(ASP Nuke)的优势和适用场景
    本文推荐了一个ASP的内容管理框架ASP Nuke,并介绍了其主要功能和特点。ASP Nuke支持文章新闻管理、投票、论坛等主要内容,并可以自定义模块。最新版本为0.8,虽然目前仍处于Alpha状态,但作者表示会继续更新完善。文章还分析了使用ASP的原因,包括ASP相对较小、易于部署和较简单等优势,适用于建立门户、网站的组织和小公司等场景。 ... [详细]
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 在数据分析工作中,我们通常会遇到这样的问题,一个业务部门由若干业务组构成,需要筛选出每个业务组里业绩前N名的业务员。这其实是一个分组排序的 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 物联网、工业互联网大数据的特点-随着数据通讯成本的急剧下降,以及各种传感技术和智能设备的出现,从手环、共享出行、智能电表、环境监测设备到电梯、数控机床、挖掘机、工业生产线等都在源 ... [详细]
author-avatar
今天是星期天嘛_512
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有