SQL中trunc(date)函数作用及年龄计算场景使用疑问
TRUNC函数在年龄计算场景的作用说明
1. TRUNC函数基础能力
你当前代码中用到的是TRUNC的数值截断特性,和你提到的TRUNC(date)日期截断是同一个函数的不同用法:
- 数值截断:直接删除数值的小数部分,仅保留整数,不会做四舍五入,比如
TRUNC(27.8)返回27,TRUNC(26.1)返回26 - 日期截断:是把日期按照指定精度截断,比如
TRUNC(SYSDATE,'MM')会返回当月第一天,你当前的年龄计算逻辑并没有用到这个特性
2. 年龄计算逻辑拆解
你用到的年龄计算代码可以拆为三步理解:
concat(TRUNC((SYSDATE - TO_DATE(co.customerdob, 'DD-MON-YYYY'))/ 365.25),' years old')
- 第一步:
SYSDATE - TO_DATE(co.customerdob, 'DD-MON-YYYY'),两个日期相减得到的是从出生日期到当前时间的总天数,比如1996年3月12日到2023年3月10日,总天数为9860天 - 第二步:总天数除以365.25,把天数换算成年数,除以365.25是为了兼容每4年一次的闰年误差,上面的9860天换算后得到
9860/365.25≈26.996 - 第三步:用TRUNC截断小数,直接得到整数26,拼接后最终展示为
26 years old,刚好符合周岁计算规则:没过生日就不算长一岁
3. 不用TRUNC的问题
如果去掉TRUNC,最终展示结果会是带小数的年龄,比如26.996 years old,不符合常规的年龄展示要求。如果换成四舍五入的ROUND函数,26.6就会被算成27,等于还没过生日就提前给人算大了一岁,不符合业务逻辑。
内容的提问来源于stack exchange,提问作者Raymond Jian
相关产品推荐
相关产品推荐

