精华内容
下载资源
问答
  • 文档日期:2019年1220日转译自 How To Calculate Age From Date Of Birth In MySQL- Querychat,...本文中看我们尝试SQL 年龄计算 —— 组件MySQL没有开箱即用的工具,用于计算年龄。所以,这也阻挡不了我们求知...

    367c1c8965da6171f3f1f01c38f41606.png

    文档日期:2019年12月20日

    转译自 How To Calculate Age From Date Of Birth In MySQL- Querychat,中文转载,请注明出处。

    使用SQL语句计算年龄,在事务处理和日期计算中,较为常见。MySQL提供了许多日期函数,可以自由发挥。本文中看我们尝试

    SQL 年龄计算 —— 组件

    MySQL没有开箱即用的工具,用于计算年龄。所以,这也阻挡不了我们求知的热情。工具不够,自己来凑。没有直接的函数,我们就用给的函数,组装出来一个。

    说白了,年龄就是啷个日期差。当前日期,减去生日。那就是年龄。

    MySQL已经提供的函数,下面介绍一下:

    • CURDATE() – 返回当前日期
    • TIMESTAMPDIFF() – 计算时间差,差值单位自定义

    这俩函数就够了,日期差,获取年差值,月差值,或者其他。

    CURDATE() 返回MySQL服务器运行时间。无需传参,调用如下:

    CURDATE()

    TIMESTAMPDIFF() 调用格式如下:

    TIMESTAMPDIFF(unit, begin_date, end_date)

    单位unit决定了返回数值。unit的可选项如下:

    • YEAR
    • QUARTER
    • MONTH
    • WEEK
    • DAY
    • HOUR
    • MINUTE
    • SECOND
    • MICROSECOND

    那,我们试着组合起来,写个公式:

    SELECT TIMESTAMPDIFF(YEAR, '2018-01-20', '2019-01-21');

    上述SQL语句运行后返回 1.

    修改一下参数:

    SELECT TIMESTAMPDIFF(DAY, '2018-01-20', '2019-01-21');

    返回的是 366

    SQL 计算年龄 —— 组合起来

    学习了两个函数的使用方法,下面计算两个日期相差的年份:

    TIMESTAMPDIFF(YEAR, dob, CURDATE())

    上式dob字段,在传递给TIMESTAMPDIFF函数之前,需要转化解析为日期格式字符串,才能正常使用。

    当前日期是2019年12月20日, 假定生日是1978年8月3日,计算如下:

    SELECT TIMESTAMPDIFF(YEAR, '1978-08-03', CURDATE()); 

    计算结果 41.

    2fe780c2321749e1ec6f95796b3b6c4c.png

    MySQL 计算年龄 —— 提高精度

    上面的式子,计算出了正确的年龄。但是如果日期格式不完整,缺少月份,或者日期,都不能计算出来结果。

    26f74173e89df3635844e320e63a42dc.png

    对应同一个月份,或者同一年的日期,计算差值,年总是=0。因此我们提高精度:

    TIMESTAMPDIFF(MONTH, dob_field, CURDATE())

    计算两个日期差的月数。

    以此类推:

    TIMESTAMPDIFF(DAY, dob_field, CURDATE())

    计算两个日期差的天数。

    举一反三,我们可以相应的计算日期差的月份,和天数。 例如

    TIMESTAMPDIFF( MONTH, dob_ field, CURDATE() ) % 12 计算月部分:

    4f283d9c34ad49b70dcc4f2beeecd8ae.png

    TIMESTAMPDIFF( DAY, dob_ field, CURDATE() ) % 30.4375 计算天部分:

    bb1ce557cf86dd80c194495d0fc07474.png

    组合在一起,就是完整的年龄表达式:

    SELECT CONCAT(TIMESTAMPDIFF( YEAR, dob_ field, CURDATE() ),' Years,', TIMESTAMPDIFF( MONTH, dob_ field, CURDATE()) % 12,' Months,',FLOOR( TIMESTAMPDIFF( DAY, dob_ field, CURDATE() ) % 30.4375 ),' Days')

    其中dob_ field是包含生日的字段,或变量.

    举例说明

    创建一张表,字段包含姓名,还有生日:

    DROP TABLE IF EXISTS T1;
    CREATE TABLE T1(
        student_name VARCHAR(100), 
        dob date, 
        age_year INT, 
        age_month INT, 
        age_days INT, 
        age_formatted VARCHAR(200)
    );
    
    
    

    685bf6810dff10a2e152534d48f6e0c9.png

    创建数据库 test_age,然后创建表 t1。

    7fbc67630f3deade1b747d5567ef9ba1.png

    写入一些随机数据:

    INSERT INTO t1(student_name, dob) values ('Jennifer Brit', '1990-02-20');
    INSERT INTO t1(student_name, dob) values ('David Dunkrick', '1988-12-20');
    INSERT INTO t1(student_name, dob) values ('Michelle Morris', '2001-08-03');
    INSERT INTO t1(student_name, dob) values ('Ubaid Ali', '1987-10-19');
    INSERT INTO t1(student_name, dob) values ('Juliet Cross', '2019-01-25');

    4265805949010fa536ab01d5fcfe77aa.png

    下面我们根据生日dob字段,分别计算并更新 age_year, age_month, age_days 和age_formatted。运行以下SQL语句:

    UPDATE T1
    SET 
    AGE_FORMATTED =  
        CONCAT(
            TIMESTAMPDIFF( YEAR, DOB, CURDATE()  ),
            ' YEARS,', 
            TIMESTAMPDIFF(  MONTH, DOB, CURDATE()) % 12,
            ' MONTHS,',
            FLOOR( TIMESTAMPDIFF( DAY, DOB,  CURDATE()  ) % 30.4375 ),
            ' DAYS'
        ),
    AGE_YEAR = TIMESTAMPDIFF( YEAR, DOB, CURDATE()  ),
    AGE_MONTH = TIMESTAMPDIFF( MONTH, DOB, CURDATE()) % 12,
    AGE_DAYS = FLOOR( TIMESTAMPDIFF( DAY, DOB, CURDATE()) % 30.4375 );

    684a405029b473b049ded6c0a640602d.png

    更新完毕之后,查看结果

    SELECT * FROM T1; 

    f24a273a58b476ba78cbc8b2fe638257.png

    OK,一切结束,拿上SQL语句去数据库上测试一下吧。

    展开全文
  • 你们大部分人大概都知道怎样把日期进行分割(年、、日等),然后仅仅分割出来年、、日等放在几个函数计算出自己所需要的日期!在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数计算出在你程序...
  • 你们大部分人大概都知道怎样把日期进行分割(年、、日等),然后仅仅分割出来年、、日等放在几个函数计算出自己所需要的日期!在这篇文 章里,我将告诉你如何使用DATEADD和DATEDIFF函数计算出在你...
  • 6.2.1 显示当前日期 6.2.2 显示任意日期 6.2.3 生成一系列日期 6.2.4 把非日期字符串转换为日期 6.2.5 计算两个日期之间天数 6.2.6 计算两日期之间工作日数 6.2.7 计算指定王作日日期 6.2.8 计算两日...
  • 6.2.1 显示当前日期 6.2.2 显示任意日期 6.2.3 生成一系列日期 6.2.4 把非日期字符串转换为日期 6.2.5 计算两个日期之间天数 6.2.6 计算两日期之间工作日数 6.2.7 计算指定王作日日期 6.2.8 计算两日...
  • 出版日期:2008 年1 开本:16开 页码:300 版次:5-1 内容简介  本书是一本讲述数据库系统原理经典教材,重点强调了数据库设计与实现。全书分为4部分。第一部分讲述事务处理概念、并发控制技术和数据库...
  • 你们大部分人大概都知道怎样把日期进行分割(年、、日等),然后仅仅分割出来年、、日等放在几个函数计算出自己所需要的日期! 在这篇文章里,我将告诉你如何使用DATEADD和DATEDIFF函数计算出在你程序...
  • Linux最早起源是在1991年105日由一位芬兰大学生Linux Torvalds (Torvalds@kruuna.helsinki.fi)写了 Linux核心程序 0.02 版开始,但其后发展却几乎都 是由互联网上 Linux社团(Linux Community)互通...
  • delphi 开发经验技巧宝典源码

    热门讨论 2010-08-12 16:47:23
    0186 获得系统当前日期 122 0187 将日期时间格式化为指定格式 122 0188 计算两个日期之间相差天数 123 0189 根据指定日期返回星期几 123 0190 将日期转换为字符串 124 0191 判断日期是否改变 124 0192...
  • excel使用

    2012-11-25 17:06:01
    (3) 日期的输入如果要输入“45日”,直接输入“4/5”,再敲回车就行了。如果要输入当前日期,按一下“Ctrl+;”键。(4) 填充条纹如果想在工作簿中加入漂亮的横条纹,可以利用对齐方式中的填充功能。先在一...
  • 目前从事软件需求工程、网络协议验证形式化方法以及函数式语言等方面研究。 目录 封面 -29 封底 -28 书名 -27 版权 -26 出版说明 -25 关于作者 -22 前言 -21 序言 -20 目录 -18 第1章 引言和概述 1 1.1 使用...
  • 8.5.4 找两个日期的差 236 8.5.5 显示日期一部分的字符串值 237 8.5.6 使用DATEPART显示日期一部分的整数值 237 8.5.7 使用YEAR、MONTH和DAY显示日期一部分的整数值 238 8.6 类型转换 238 8.6.1 转换...
  •  本书深入浅地介绍了目前世界上最受欢迎数据库管理系统之一——sql server。全书共分三个部分:第一部分阐释了数据库基本概念,讲解了数据库建模语言;第二部分展示了从概念建模到在 sql server 2008上真正...
  • 实例238 列出系统打印机 330 7.12 其他 332 实例239 两种信息发送方式 332 实例240 功能快捷键 336 第8章 注册表 339 8.1 操作注册表 340 实例241 怎样存取注册表信息 340 实例242 注册表保存...
  • 鉴于市场上用户手机型号、种类、屏幕分辨率等参差不齐,传统方式根据主流系统分别开发相应的系统耗时又耗力,为了高效开发并节约开发项目成本,本文采用Android+HTML5相结合方式进行移动端Web系统的设计研发工作...
  • C#编程经验技巧宝典

    热门讨论 2008-06-01 08:59:33
    115 <br>0192 如何获取“我文档”系统文件夹路径 115 <br>0193 如何获取应用程序当前执行路径 116 <br>0194 如何获取当前操作系统的信息 116 <br>0195 如何实现基本数据类型随意转换 116...
  • 说明: 指定与 TO_CHAR 和 TO_DATE 函数一同使用默认日期格式。该参数默认值由 NLS_TERRITORY 确定。该参数值可以是包含在双引号内任何有效的日期格式掩码。例如: ''MMM/DD/YYYY''。 值范围: 任何有效的日期...
  • 问题1 单元数组占用内存空间如何计算 86 问题2 如何生成指定格式常矩阵、字符串 87 问题3 如何生成随机矩阵 90 问题4 如何查找或删除数据中满足条件元素 91 问题5 如何给数组元素排序 94 问题6 如何从...
  • java源码包---java 源码 大量 实例

    千次下载 热门讨论 2013-04-18 23:15:26
     Java生成密钥、保存密钥实例源码,通过本源码可以了解到Java如何产生单钥加密密钥(myKey)、产生双钥密钥对(keyPair)、如何保存公钥字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
  • o 4.5 我可否括号来强制执行我所需要的计算顺序? o 4.6 可是 && 和 || 运算符呢?我看到过类似 while((c = getchar()) != EOF && c != '\n') 代码 …… o 4.7 我怎样才能理解复杂表达式?``序列点" 是什么?...
  • 本书目的就是帮助读者了解c++是如何支持编程技术,使读者能从中获得新理解,从而成为一名优秀编程人员和设计人员。适合做高校面向对象编程课程教科书,也可作为c++爱好者参考书。 [center] [a href=...
  • 实例174 获取当前日期与指定日期的绝对值 实例175 使用Shell函数打开记事本 实例176 获取系统环境信息 实例177 掷骰子 实例178 倒计时程序 实例179 数字时钟 实例180 文本加密与解密 实例181 我的计算器 ...
  • 本书目的就是帮助读者了解c++是如何支持编程技术,使读者能从中获得新理解,从而成为一名优秀编程人员和设计人员。适合做高校面向对象编程课程教科书,也可作为c++爱好者参考书。 [center] [a href=...
  • 程序开发范例宝典>>

    2012-10-24 10:41:28
    实例219 得到系统当前目录 306 实例220 在程序中改变当前路径 307 6.5 复制文件 307 实例221 使用FileStream复制大文件 308 实例222 复制文件时显示复制进度 310 实例223 批量复制文件 312 6.6 ...
  • C++程序设计语言(特别版)--源代码

    热门讨论 2012-04-23 07:33:51
    本书目的就是帮助读者了解c++是如何支持编程技术,使读者能从中获得新理解,从而成为一名优秀编程人员和设计人员。适合做高校面向对象编程课程教科书,也可作为c++爱好者参考书。 [center] [a href=...
  • java源码包2

    千次下载 热门讨论 2013-04-20 11:28:17
     Java生成密钥、保存密钥实例源码,通过本源码可以了解到Java如何产生单钥加密密钥(myKey)、产生双钥密钥对(keyPair)、如何保存公钥字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...
  • 实例219 得到系统当前目录 306 实例220 在程序中改变当前路径 307 6.5 复制文件 307 实例221 使用FileStream复制大文件 308 实例222 复制文件时显示复制进度 310 实例223 批量复制文件 312 6.6 指定...
  • 实例219 得到系统当前目录 306 实例220 在程序中改变当前路径 307 6.5 复制文件 307 实例221 使用FileStream复制大文件 308 实例222 复制文件时显示复制进度 310 实例223 批量复制文件 312 6.6 指定...
  • 实例243 列出系统打印机 309 6.11 其他 310 实例244 两种信息发送方式 310 实例245 使用线程添加数据 312 实例246 功能快捷键 314 第7章 注册表 317 7.1 操作注册表 318 实例247 怎样存取注册表...
  • java源码包3

    千次下载 热门讨论 2013-04-20 11:30:13
     Java生成密钥、保存密钥实例源码,通过本源码可以了解到Java如何产生单钥加密密钥(myKey)、产生双钥密钥对(keyPair)、如何保存公钥字节数组、保存私钥到文件privateKey.dat、如何用Java对象序列化保存私钥...

空空如也

空空如也

1 2 3 4 5
收藏数 84
精华内容 33
关键字:

如何用函数计算出系统当前日期的月