MDX:如何计算日期和年初之间的月数?

时间:2018-03-06 14:24:32

标签: date mdx iccube mdx-query

使用iccube,我想计算一个日期和年初之间的月数。

我的日期维度中有2个层次结构: [Date de sortie].[Année, semestre, trimestre, mois, jour]:包含年,半年,季度,月和日 [Date de sortie].[Année et Mois]包含年份和月份

执行以下mdx会给我带来好结果(5个月)

with 
set myData as {[Date de sortie].[Année et Mois].[Mois].&[2017-01-01]:[Date de sortie].[Année et Mois].[Mois].&[2017-05-01]} 
member nbMonths as  myData.count
select
{
    nbMonths
} on 0,
myData on 1
from [Cube]

但是,在尝试对此进行参数化时,它会使用从数据的第一个日期开始的句号,而不是使用计算的日期(一年的第一天)开始句点。

with 
calculated member beginOfYear as dtWithDayOfYear(lookupByKey([Date de sortie].[Année, semestre, trimestre, mois, jour].[Jour], [Date de sortie].[Année et Mois].[Mois].&[2017-05-01].key),1).key
set myData as {lookupbykey([Date de sortie].[Année et Mois].[Mois], beginOfYear):[Date de sortie].[Année et Mois].[Mois].&[2017-05-01]} 
calculated member nbMonths as  myData.count
select
{
    nbMonths, beginOfYear
} on 0,
myData on 1
from [Cube]

enter image description here

...

enter image description here

结果你可以看到,beginOfYear似乎正确计算,但没有在set myData中使用。因此,它返回113而不是5。

1 个答案:

答案 0 :(得分:0)

仅使用MDX可能很复杂,一个选项是在icCube中使用Java接口

通过声明一个需要两个日期并使用Joda库的函数,这将是直截了当的:

Function NumberOfMonth( Value date1 ,Value date2 ) as
            abs(J!org.joda.time.Months.monthsBetween(date2, date1)->getMonths() )

代码如下:

WITH 
  FUNCTION NumberOfMonth( Value date1 ,Value date2 ) as abs( J!org.joda.time.Months.monthsBetween(date2, date1)->getMonths() )
  MEMBER Diff as NumberOfMonth( [D. Time].[H. Time].[Day].&[2015-03-02].key, [D. Time].[H. Time].[Day].&[2015-10-02].key )
SELECT
 [Diff] ON 0
FROM [Sales]

------- 2018年3月8日-------

不要忘记打开Java模块并将classRepositoryActive设置为true(如果将在下一个版本中修复错误,则为最新版本)