在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,太正常不过了,所以,大胆地去尝试,去做,就对了!