oracle 根据当前日期判断人员年龄的几种实现方式

最近翻看之前的写的sql语句代码,发现判断年龄的语句比较粗糙,上网搜了一下,感觉写的都不太理想,我就自己写了一段,以供参考。

方式一:以 年 为 精确度

select (
to_char(sysdate,'YYYY') - 
to_char(to_date('1995-08-09','YYYY-MM-DD'),'YYYY') 
)as nl 
from dual;

计算过程及结果

当前的日期为 2024-07-15
当前的年份为 2024
出生的日期为 1995-08-09
出生的年份为 1995
结果为 2024-1995 = 29

分析:
以年份判断年龄最大的弊端就是,精确度不足,如上所示 当前的年龄其实不足29岁,应该是28岁,因为月份还没到。年份判断可以简单理解为 年龄是在向上取值,取的是最大值。

方式二 以月 为 精确度

select (
case 
	when 
		to_char(sysdate,'MM') <  to_char(to_date('1995-08-09','YYYY-MM-DD'),'MM')
		--当前月份 小于 出生日期的月份时
	then 
		(to_char(sysdate,'YYYY') - to_char(to_date('1995-08-09','YYYY-MM-DD'),'YYYY'))-1
		--返回 当前年份-出生年份 并且减去 1 
	else 
		(to_char(sysdate,'YYYY') - to_char(to_date('1995-08-09','YYYY-MM-DD'),'YYYY'))
		--直接返回 当前年份-出生年份 
end
)as nl 
from dual;

分析:
以月度为精确度,提高了年龄的精确程度,这是用了case when 判断稍微复杂一些,但是逻辑算法很清晰,应该有更简单的计算方式,日后补充吧

方式三 以天 为 精确度

select 
floor((sysdate -to_date('1995-08-09','YYYY-MM-DD'))/365) as nl 
-- sysdate -to_date('1995-08-09','YYYY-MM-DD')  这里可以得出两个日期的相差天数的近似值
-- 除以365 是因为一年365天 闰年为366天 。这里除以 一个较小一点数字 365
--floor() 函数,是向下取整的意思。
--tunc()是直接取整的意思,不论小数点后的数字大小 和 floor() 函数的结果是一样的
from dual;

分析:
以天为计算的方式,个人感觉逻辑上有点不太严谨,但是结果的精确度也还可以,误差天数约在8天左右。

方式四 同样是以天 为 精确度

select (
case 
	when 
		to_char(sysdate,'MM') <  to_char(to_date('1995-08-09','YYYY-MM-DD'),'MM')
		--当前月份 小于 出生日期的月份时
	then 
		(to_char(sysdate,'YYYY') - to_char(to_date('1995-08-09','YYYY-MM-DD'),'YYYY'))-1
		--返回 当前年份-出生年份 并且减去 1 
	when 
		to_char(sysdate,'MM') =  to_char(to_date('1995-08-09','YYYY-MM-DD'),'MM') 
		and
		to_char(sysdate,'DD') <  to_char(to_date('1995-08-09','YYYY-MM-DD'),'DD')
		--当前月份 等于 出生日期的月份时
		--并且 当前的天数 小于 出生日期的天数时
	then 
		(to_char(sysdate,'YYYY') - to_char(to_date('1995-08-09','YYYY-MM-DD'),'YYYY'))-1
		--返回 当前年份-出生年份 并且减去 1 
	else 
		(to_char(sysdate,'YYYY') - to_char(to_date('1995-08-09','YYYY-MM-DD'),'YYYY'))
		--直接返回 当前年份-出生年份 
end
)as nl 
from dual;

分析:
这个逻辑虽然很复杂,但这是精确度最高的一种方式,几乎是没有误差。

总结:
计算或者统计的原则不是越精确越好,而是根据不同的需求选择不同的方式,越合适越好。
以上几种方式,以供参考和学习。

  • 14
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值