第一种方法

用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. 关于mysql使用utf8编码在cmd窗口无法添加中文数据的问题以及解决 方法二

    如果非要用cmd窗口的话,那么可以加这句话,set names gbk:

  2. Mybatis实现批量删除数据

    Mybatis实现批量删除操作 学习内容: 1. 使用 2. 代码实现 2.1 UserMapper.java 接口 2.2 UserMapper.xml 总结: 学习内容: 1. 使用 这里通过动态 ...

  3. 小程序中webview内嵌h5页面

    小程序内嵌h5页面跳转小程序指定页面,  需要引用  JSSDK:   <script src="https://res.wx.qq.com/open/js/jweixin-1.3.2 ...

  4. rem,px,em最大的区别;

    px:px像素(Pixel).相对长度单位.像素px是相对于显示器屏幕分辨率而言的.移动端的分辨率很多.所以px不适用移动端em:em的值不固定:其长度继承父级元素的字体大小rem:相对于根元素htm ...

  5. 浅谈一下流式处理平台Flink

    浅谈一下流式处理平台(Flink) 大数据框架听过很多,比如 Hadoop,HDFS...不过自己的项目都没有上过 为什么突然提到 Flink,因为最近一个项目需要用到,所以学习最好的方式就是项目驱动 ...

  6. Oracle数据库包括两个部分数据库和数据库实例

    olsnodes,这个命令用来显示集群点列表(grid即oracle rac的第三个安装包内的软件,可找到) //集群名称[grid@shdb02 ~]$ olsnodes -cshfpdb-clus ...

  7. 推荐个我在用的免费翻译软件,支持多家翻译API整合

    前段时间发了个关于<Spring支持PHP>的视频:点击查看 然后有小伙伴留言说:"你这个翻译好像很好用的样子". 的确,我自己也觉得很好用.之前视频没看过的不知道是哪 ...

  8. 在vue项目中配置webpack

    首先我们来看一下使用Vue-cli2与Vue-cli2之后的版本(这里以Vue-cli4版本为例)创建项目目录结构的不同: Vue-cli2(左图)与Vue-cli4(右图)创建项目的目录 从上图可以 ...

  9. 记一次Linux Centos7病毒清理

    记一次在工作中测试环境下中病毒的处理解决办法,都说linux系统非常安全,但是很多人百年一遇的病毒被我遇上了,公司三台测试环境服务器中招. 最开始系统突然变得很卡,使用top命令查看资源占用情况,发现 ...

  10. Go语言学习——map

    map 映射关系容器 内部使用散列表(hash)实现 map是引用类型 必须初始化才能使用 无序的基于key-value的数据结构 map定义 map的定义语法: map[KeyType]ValueT ...