第一种方法

用DATEDIFF函数,DATEDIFF(YEAR,beginDate,endDate)。

测试语句:

1 DECLARE @birthdayDate DATE
2 DECLARE @endDate DATE
3 DECLARE @age INT
4
5 SET @birthdayDate ='2003-08-08'
6 SET @endDate = '2008-07-08'
7
8 SET @age = DATEDIFF(YEAR,@birthdayDate,@endDate)
9 SELECT @age AS 年龄

执行结果:

这种方法计算出的年龄,是个大概年龄,是“年”意义下的年龄,就是普罗大众对年龄的理解下的年龄。

如果按“月”、“日”去计算,上述例子中的年龄其实是不足5岁的。

所以,当我们写的程序对年龄的计算的精度要求比较高时,

比如社保待遇的享受起始时间、退休金发放起始时间的计算,需要对年龄的精确计算;

政治生活中,干部的提拔、退职,也都涉及到年龄的精确计算;

民事刑事案件中当事人年龄的计算,年龄的大小直接涉及到量刑的轻重,所以也需要对年龄进行精确计算。

第二种方法

FLOOR(DATEDIFF(DAY,@birthdayDate,@endDate)/365.25)

FLOOR函数:返回小于或等于指定数值表达式的最大整数。又称,向下取整函数。

(Returns the largest integer less than or equal to the specified numeric expression.)

PS:numberic expression,数值表达式 ,arithmeric expression,算术表达式。

FLOOR(4)=4,

FLOOR(4.2)=4,

FLOOR(4.5)=4,

FLOOR(4.9)=4.

测试语句:

1 DECLARE @birthdayDate DATE
2 DECLARE @endDate DATE
3 DECLARE @age FLOAT
4
5 SET @birthdayDate ='2003-08-08'
6 SET @endDate = '2008-07-08'
7
8 SET @age = FLOOR(DATEDIFF(DAY,@birthdayDate,@endDate)/365.25)
9 SELECT @age AS 年龄

执行结果:

算法释义:

因为4年有一闰年会多1天,多除以0.25,相当于把这一天平均摊到这4年,保证每4年的误差归零。

这个算法其实也有小小的误差,除非出生不满一岁就碰到闰月,先有一天再来递减,会完全正确,不然的话在遇到闰年前会差一天,遇到闰年后变准确,但是当这个闰年补完4年差额在遇到下一个闰年之前又会差一天。也就是生日当天程序会显示没满周岁。

我们测试一下,比如2000、2004、2008年是闰年,但是2001、2002、2003、2005、2006、2007年都不是闰年。

假定李某在2001-02-08出生,我们用2002、2003、2004年生日当天去计算年龄时,都会发生误差。

因为2004年是闰年,用2005年生日当天去计算年龄就正确,过了2005年(2005-2001=4),我们用2006、2007、2008年生日当天去计算年龄,也会发生误差。

如果李某在2001-03-08(只要过了2月的一个日期就行)出生,

我们用2002、2003年生日当天去计算年龄时,会发生误差。

但是用2004、2005年生日当天去计算年龄就正确,过了2005年(2005-2001=4),我们用2006、2007年生日当天去计算年龄,也会发生误差。

用2008年生日当天去计算年龄,就没有误差。

亲读者自行验证。

SQL年龄计算方法的更多相关文章

  1. 那些SQL语句

    根据book_id,class_id确定老师uid select user_id from lessons left join book on lessons.lesson_id = book.les ...

  2. FastReport.Net使用:[13]如何使用表达式

    在FastReport报表中,表达式(Expressions)用在很多地方,譬如文本框,排序过滤器等. 表达式基于报表选择的脚本语言,从菜单[报表]->[选项]打开“报表选项对话框”,切换到“脚 ...

  3. oracle中SQL根据生日日期查询年龄的方法

    方法:SELECT Trunc(MONTHS_BETWEEN(SYSDATE,BIRTH_DATE)/12) FROM 某表 Trunc函数在这里对带有小数位数的数字取整数部分: SYSDATE为or ...

  4. sql server 根据身份证号计算出生日期和年龄的存储过程

    我这边有一个业务,需要客户填写身份证号,自动计算他的出生日期和年龄 在sql中,具体的存储过程实现是这样的: /******************************************** ...

  5. sql语句——根据身份证号提取省份、出生日期、年龄、性别。

    原表 sql语句: SELECT ) ' then '北京市' ' then '天津市' ' then '河北省' ' then '山西省' ' then '内蒙古自治区' ' then '辽宁省' ...

  6. SQL 根据日期精确计算年龄

    SQL 根据日期精确计算年龄 第一种: 一张人员信息表里有一人生日(Birthday)列,跟据这个列,算出该人员的年龄 datediff(year,birthday,getdate()) 例:birt ...

  7. 用sql语句实现年龄分段统计

    SELECT CASE WHEN (age >= 10 AND age <= 20) THEN '10-20' WHEN (age >= 21 AND age <= 30) T ...

  8. sql获取时间、年龄

      mysql数据库获取年龄:TIMESTAMPDIFF(YEAR, [出生日期字段], CURDATE()) select * from (select name 姓名,TIMESTAMPDIFF( ...

  9. SQL 根据身份证号码获取年龄的函数

    在数据库的运用过程中,我们时常会碰到根据身份证号码来获取当前的年龄,今天我在这里写了一个函数,就是关于获取年龄的 create or replace function FUNC_COMPARE_SFZ ...

随机推荐

  1. MongoDB从bson文件中恢复数据

    首先需要到mangodb的安装目录的bin下面找到mongorestore.exe WIN10系统MongoDB安装目录bin文件夹下没有mongorestore.exe 先下载工具  https:/ ...

  2. 每日所学之自学习大数据的Linux环境配置2

    今天设置网络 出现报错 明天找时间解决 不用解决了 刚才试了以下 又能下载了 描述一下问题: cannot find a valid baseurl for repo:base/7/x86_64 如果 ...

  3. CCF201909-1小明种苹果

    解题思路:定义一个二维数组来存放输入的信息,第一列用来存放所有果树的初始值,然后遍历数组.具体思路见代码注释. 第一遍提交得了80分,看了半天才明白了原因,快被自己蠢死...... 定义数组应该为a[ ...

  4. Qt QPropertyAnimation+QTimer实现自制悬浮窗

    目录 Qt下的悬浮窗 QPropertyAnimation QTimer 事件过滤 图标变换 自适应窗口大小 使用方法 Qt下的悬浮窗 最近项目需要一个类似于360悬浮球类似的悬浮窗,当鼠标放入停留一 ...

  5. 论文解读(GRCCA)《 Graph Representation Learning via Contrasting Cluster Assignments》

    论文信息 论文标题:Graph Representation Learning via Contrasting Cluster Assignments论文作者:Chun-Yang Zhang, Hon ...

  6. 注册中心Eureka的简单使用

    不讲原理,只讲简单使用 微服务,一般是父子工程,可以直接在父工程下新建个模块来用来启动Eureka 1.创建Eureka模块 2.引入依赖 <dependency> <groupId ...

  7. Python 每日提醒写博客小程序,使用pywin32、bs4库

    死循环延迟调用方法,使用bs4库检索博客首页文章的日期是否与今天日期匹配,不匹配则说明今天没写文章,调用pywin32库进行弹窗提醒我写博客.

  8. 【课程汇总】OpenHarmony 成长计划知识赋能第二期课程(附链接)

    OpenHarmony 开源开发者成长计划第二期知识赋能直播课程以入门为主,共设置 8 节课,覆盖了应用开发.设备开发.内核驱动等多个技术领域.带领开发者快速了解如何玩转 OpenHarmony.如何 ...

  9. Codeforces Round #742 (Div. 2) B. MEXor Mixup

    题目链接 Problem - B - Codeforces 题意: 给出MEX 和 XOR(分别表示1. 本串数不存在的最小非负数  2. 本串数所有数异或后的结果) 求出这串数最少有几个数, 1 ≤ ...

  10. Visual Studio2019 F5调试程序时选择文件后调试控制台进程关闭问题

    问题:Visual Studio2019 F5调试程序时选择文件后调试控制台进程关闭问题 解决方案: 修改Visual Studio 配置项 [工具]-[选项]-[项目和解决方案]-[Web项目]-[ ...