这个经常用来计算年龄的函数竟然有BUG!怎么办?

在DAX里,我们计算年龄经常会用YEARFRAC函数,但最近才注意到,原来这个函数计算年龄时会有BUG!

DAX.Guide网站上,这一点在YEARFRAC函数的介绍中提到以下例子:

代码语言:javascript
复制
-- The following expression should return 19 and it returns 18 instead
-- 以下公式本该返回19,但却返回18!
-- because YEARFRAC returns a decimal number slightly smaller then 19.
-- 因为YEARFRAC这里返回一个比19小一丢丢的小数!
INT ( 
      YEARFRAC (        
          DATE ( 2000, 10, 16 ), 
          DATE ( 2019, 10, 16 ),
          1
       )
)

那么,要正确计算年龄肿么办?DAX Guide给出了一个正解(稍作修改):

代码语言:javascript
复制
VAR Birthdate = Customer[Birth Date] -- 按需要改成你要引用的日期
VAR ThisDay = TODAY()
VAR IntBirthdate = YEAR ( Birthdate ) * 10000 + MONTH ( Birthdate ) * 100 + DAY ( Birthdate )
VAR IntThisDay = YEAR ( ThisDay ) * 10000 + MONTH ( ThisDay ) * 100 + DAY ( ThisDay )
VAR Age = QUOTIENT ( IntThisDay - IntBirthdate, 10000 )
VAR CheckedAge = DIVIDE ( Age, NOT ISBLANK ( Birthdate ) )
RETURN 
      CheckedAge

别看这一大串那么多行,其实原理很简单:就是把年月日做成一串数值,然后求差值再得到年数。

比如2000年10月16日,转成数值20001016,今天转成20200509,然后相减,实际就是通过这种方式,使得月和日的比较形成对年份的差值影响。如果后面的月日比生日的月日小,就会比直接求年份之差要小1……

这个算法跟我前期在讲《PQ中的年龄计算方法》的核心思路是相似的,可以对比着学一下。

由这个例子同时也可以看出,即使是如此牛逼的开发团队,依然可能写出有BUG的函数,自己写的算法或公式有点儿BUG,太正常不过了,所以,大胆地去尝试,去做,就对了!