第一种方法

用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. 从kill-chain的角度检测APT攻击

    前言 最近一直在考虑如何结合kill chain检测APT攻击.出发点是因为尽管APT是一种特殊.高级攻击手段,但是它还是会具有攻击的common feature,只要可以把握住共同特征,就能进行检测 ...

  2. Python读文件并写入数组

    直接上代码: # 读文件 def get_venue(file): fname = file # 文件名 # 获取数据长度 len = 0 with open(fname, 'r+', encodin ...

  3. java中什么叫多重捕获MultiCatch,它的用法是怎样的?

    2.多重捕获MultiCatch 马克-to-win:什么叫多重捕获MultiCatch?一段代码可能引起多个异常,这时可以定义两个或更多的catch子句来处理这种情况,每个子句捕获一种类型的异常.马 ...

  4. Ubuntu安装docker(摘自官网,自用)

    在 Ubuntu 上安装 Docker 引擎(按照标红顺序执行命令) 预计阅读时间:11分钟 适用于 Linux 的 Docker 桌面 Docker Desktop 可帮助您在 Mac 和 Wind ...

  5. 关于#pragma 和 _pragma

    首先要明确 #pragma 和_Pragma 是什么 这两个都是出自于c/c++ 的 ,其中#pragma 是预处理指令(preProcess directive ) ,#pragma是用来向编译器传 ...

  6. SpringMVC-注解@RequestParam

    当请求的参数名称与Controller的业务方法不一致时,就需要通过@RequestParam注解进行显示的绑定 1.value:映射参数 @RequestMapping("/report1 ...

  7. Python生成短uuid的方法

    python的uuid都是32位的,比较长,处理起来效率比较低, 本算法利用62个可打印字符,通过随机生成32位UUID,由于UUID都为十六进制,所以将UUID分成8组,每4个为一组,然后通过模62 ...

  8. Android四大组件——Activity——Activity数据回传

    既然可以传递数据给下一个Activity,自然也可以返回数据给上一个Activity.返回上一个Activity时只需要点击back键就好,并没有一个用于启动Activity的Intent来传递数据, ...

  9. JS加载不出来 必须alert才可以 alert另一种功能

    BEGIN; 今天在引入百度编辑器时,发现百度编辑器加载不出来. 代码是这样的: var editor = new baidu.editor.ui.Editor({    textarea: 'con ...

  10. 05. 树莓派初始配置——开启VNC远程桌面

    开启VNC远程桌面 不插显示器就可以看到树莓派系统界面的方式. 1. 如果你下的系统镜像有包含一些基本软件(Raspberry Pi OS with desktop and recommended s ...