【问题标题】:MDX : how to calculate number of months between a date and beginning of the year?MDX:如何计算日期和年初之间的月数?
【发布时间】:2018-08-14 10:39:32
【问题描述】:

使用 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]

...

正如你在上面看到的结果,beginOfYear 似乎计算正确,但未在集合 myData 中使用。因此,它返回 113 而不是 5。

【问题讨论】:

    标签: date mdx iccube mdx-query


    【解决方案1】:

    仅使用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(如果有错误将在下一个版本中修复)

    【讨论】:

    • 我刚刚尝试了您的解决方案并收到错误:la classe de la méthode 'J!'!'org.joda.time.Months.monthsBetween est inconnue : 'org.joda.time.Months'
    • 顺便说一句,也许我的问题已经太有针对性了,因为我想要的是在包含不同类型人员的层次结构上每月计算“全职当量”月并在几个月或几年的范围,变成一个平均值,也许我不需要知道几个月的数量,还有一个更简单的解决方案......
    • 关于错误您是否检查过 JAVA 支持已启用:iccube.com/support/documentation/mdx_integration/…
    • 在.xml中,我有: java.class.pathorg.joda.timeorg.joda.time.Months 仍然出现同样的错误
    • 您能否使用调用堆栈发送并确保服务器已重新启动。您使用的是什么 icCube 版本(最好是 joda-timeXXXX.jar 文件名)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多