SQL年龄计算方法
第一种方法:
用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年龄计算方法的更多相关文章
- 那些SQL语句
根据book_id,class_id确定老师uid select user_id from lessons left join book on lessons.lesson_id = book.les ...
- FastReport.Net使用:[13]如何使用表达式
在FastReport报表中,表达式(Expressions)用在很多地方,譬如文本框,排序过滤器等. 表达式基于报表选择的脚本语言,从菜单[报表]->[选项]打开“报表选项对话框”,切换到“脚 ...
- oracle中SQL根据生日日期查询年龄的方法
方法:SELECT Trunc(MONTHS_BETWEEN(SYSDATE,BIRTH_DATE)/12) FROM 某表 Trunc函数在这里对带有小数位数的数字取整数部分: SYSDATE为or ...
- sql server 根据身份证号计算出生日期和年龄的存储过程
我这边有一个业务,需要客户填写身份证号,自动计算他的出生日期和年龄 在sql中,具体的存储过程实现是这样的: /******************************************** ...
- sql语句——根据身份证号提取省份、出生日期、年龄、性别。
原表 sql语句: SELECT ) ' then '北京市' ' then '天津市' ' then '河北省' ' then '山西省' ' then '内蒙古自治区' ' then '辽宁省' ...
- SQL 根据日期精确计算年龄
SQL 根据日期精确计算年龄 第一种: 一张人员信息表里有一人生日(Birthday)列,跟据这个列,算出该人员的年龄 datediff(year,birthday,getdate()) 例:birt ...
- 用sql语句实现年龄分段统计
SELECT CASE WHEN (age >= 10 AND age <= 20) THEN '10-20' WHEN (age >= 21 AND age <= 30) T ...
- sql获取时间、年龄
mysql数据库获取年龄:TIMESTAMPDIFF(YEAR, [出生日期字段], CURDATE()) select * from (select name 姓名,TIMESTAMPDIFF( ...
- SQL 根据身份证号码获取年龄的函数
在数据库的运用过程中,我们时常会碰到根据身份证号码来获取当前的年龄,今天我在这里写了一个函数,就是关于获取年龄的 create or replace function FUNC_COMPARE_SFZ ...
随机推荐
- 从kill-chain的角度检测APT攻击
前言 最近一直在考虑如何结合kill chain检测APT攻击.出发点是因为尽管APT是一种特殊.高级攻击手段,但是它还是会具有攻击的common feature,只要可以把握住共同特征,就能进行检测 ...
- Python读文件并写入数组
直接上代码: # 读文件 def get_venue(file): fname = file # 文件名 # 获取数据长度 len = 0 with open(fname, 'r+', encodin ...
- java中什么叫多重捕获MultiCatch,它的用法是怎样的?
2.多重捕获MultiCatch 马克-to-win:什么叫多重捕获MultiCatch?一段代码可能引起多个异常,这时可以定义两个或更多的catch子句来处理这种情况,每个子句捕获一种类型的异常.马 ...
- Ubuntu安装docker(摘自官网,自用)
在 Ubuntu 上安装 Docker 引擎(按照标红顺序执行命令) 预计阅读时间:11分钟 适用于 Linux 的 Docker 桌面 Docker Desktop 可帮助您在 Mac 和 Wind ...
- 关于#pragma 和 _pragma
首先要明确 #pragma 和_Pragma 是什么 这两个都是出自于c/c++ 的 ,其中#pragma 是预处理指令(preProcess directive ) ,#pragma是用来向编译器传 ...
- SpringMVC-注解@RequestParam
当请求的参数名称与Controller的业务方法不一致时,就需要通过@RequestParam注解进行显示的绑定 1.value:映射参数 @RequestMapping("/report1 ...
- Python生成短uuid的方法
python的uuid都是32位的,比较长,处理起来效率比较低, 本算法利用62个可打印字符,通过随机生成32位UUID,由于UUID都为十六进制,所以将UUID分成8组,每4个为一组,然后通过模62 ...
- Android四大组件——Activity——Activity数据回传
既然可以传递数据给下一个Activity,自然也可以返回数据给上一个Activity.返回上一个Activity时只需要点击back键就好,并没有一个用于启动Activity的Intent来传递数据, ...
- JS加载不出来 必须alert才可以 alert另一种功能
BEGIN; 今天在引入百度编辑器时,发现百度编辑器加载不出来. 代码是这样的: var editor = new baidu.editor.ui.Editor({ textarea: 'con ...
- 05. 树莓派初始配置——开启VNC远程桌面
开启VNC远程桌面 不插显示器就可以看到树莓派系统界面的方式. 1. 如果你下的系统镜像有包含一些基本软件(Raspberry Pi OS with desktop and recommended s ...