计算日期差值是数据分析的一个高频应用,本文以年龄计算为例,演示如何在 DAX 中计算日期差值。
IN EXCEL
Excel 中通常使用 DATEDIF 函数计算年龄,它的写法是
DATEDIF([起始日期],[结束日期],”Y”)
以今天 2017/1/16 作为结束日期,开始日期大于 2016/1/16 的计算结果都显示为 0,表示不满一年,这符合我们惯常的逻辑。
IN DAX
DAX 里有一个 DATEDIFF 函数,可以实现类似功能
DATEDIFF([起始日期],[结束日期],year)
但它在计算开始日期为 2016/1/16 至 2016/12/31 之间的日期时,结果都为 1,也就是说,这个函数只考虑年份之间的差值,忽略月份和日期。通常这并不是我们想要的结果,不确定这是否是一个 bug,但是我们还有其他解决方案。
方案 1:构造条件判断,在月份和日期的组合符合要求时使用 DATEDIFF,否则-1.
=IF( (MONTH(TODAY())=MONTH('表 2'[日期]) && DAY(TODAY())>DAY('表 2'[日期])) || MONTH(TODAY())>MONTH('表 2'[日期]), DATEDIFF('表 2'[日期],TODAY(),YEAR), DATEDIFF('表 2'[日期],TODAY(),YEAR)-1 )
方案 2:YEARFRAC 函数 返回精确值
其实,这个函数才是 DAX 中最适合用来计算年龄的,它返回两个日期之间的完整天数占全年天数的比例,可以返回精确到小数点的年份间隔。
YEARFRAC([起始日期],[结束日期],2)
DATEDIFF似乎不考虑小数,比如计算年的时候就不考虑月份,直接把两个年数相减;计算月就不考虑日期,直接把年份相减*12+月份相减。
66666