2014-03-25 42 views
0

我试图创建一组使用DateAdd()函数的日期,但我得到的错误,同时试图传递一个元组作为参数的。 下面的代码返回一个成员,但我正在寻找一组新的日期。MDX DateAdd函数在一个元组

WITH 会员[EFF INJ DT] AS DATEADD( “M”,12,[损伤日期] .CurrentMember)

SELECT {[EFF INJ DT]} ON COLUMNS, [INJURY DATE].[DATE].Members ON ROWS 
FROM [WVWC DATA CUBE FROI SROI] 

我有以下尝试:

WITH 
Set [EFF INJ DT] AS 
DATEADD("M",12, [INJURY DATE].CurrentMember) 

SELECT {[EFF INJ DT]} ON COLUMNS, [INJURY DATE].[DATE].Members ON ROWS 
FROM [WVWC DATA CUBE FROI SROI] 
+0

请指定一组您所需要的日期? – whytheq

+0

是什么让你觉得'DATEADD'是一个MDX函数? – whytheq

回答

0

如果您想要移动12个成员forwa然后你可以用几种方式进行导航。

请尝试以下操作。它应该返回的日期提前currentmember 12天:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS 
     [Date].[Calendar].CurrentMember.LEAD(12).MEMBERVALUE 
SELECT 
    {[MEASURES].[EFF INJ DT]} ON 0, 
    {[Date].[Calendar].[Month].&[2006]&[4].CHILDREN} ON 1 
FROM [Adventure Works]; 

看起来你想返回12个月在将来的日期。

所以首先我们需要通过ANCESTOR函数对应于currentmember年>然后使用COUSIN功能类似下面的前进等效日期:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS 
    COUSIN(
     [Date].[Calendar].CurrentMember, 
     ANCESTOR(
      [Date].[Calendar].CurrentMember, 
      [Date].[Calendar].[Calendar Year]).LEAD(1) 
      ).membervalue 
SELECT 
    {[MEASURES].[EFF INJ DT]} ON 0, 
    {[Date].[Calendar].[Month].&[2006]&[4].CHILDREN} ON 1 
FROM [Adventure Works]; 

适应您的方案,并假设INJURY DATE是一个多层次的user hierarchy' that contains another level called日历Year`你可以做到以下几点:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS 
     COUSIN(
      [INJURY DATE].CurrentMember, 
      ANCESTOR(
       [INJURY DATE].CurrentMember, 
       [INJURY DATE].[Calendar Year]).LEAD(1) 
       ).MEMBERVALUE 
SELECT 
    {[MEASURES].[EFF INJ DT]} ON 0, 
    {[INJURY DATE].[DATE].Members} ON 1 
FROM [Adventure Works]; 

编辑

经由VBA工具,我们在进阶Wrks如下:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS 
     DATEADD(
     "M", 
     12, 
     [Date].[Calendar].CurrentMember.membervalue 
    ) 
SELECT 
    {[MEASURES].[EFF INJ DT]} ON 0, 
    {[Date].[Calendar].[Month].&[2006]&[4].CHILDREN} ON 1 
FROM [Adventure Works]; 

适合您的方案:

WITH 
    MEMBER [MEASURES].[EFF INJ DT] AS 
    DATEADD(
    "M", 
    12, 
    [INJURY DATE].CurrentMember.membervalue 
    ) 
SELECT 
    {[MEASURES].[EFF INJ DT]} ON 0, 
    {[INJURY DATE].[DATE].Members} ON 1 
FROM [Adventure Works]; 
+0

感谢whyth的快速反应。您提供的代码不符合我的目的。它给了我从当前日期开始的下一个成员的日期,但是我正在寻找比当前时间提前12个月的日期。在我的[伤害日期]维度中,年份之间存在差距(1920,1921,1924,1930,1931等)。 因此,此代码为我提供了当前日期的下一个日期(即1924年之后它给出的1930年),而我需要1925年 这就是为什么我试图做一个DateAdd().. – pso

+0

你可以开始玩'MDX'中的字符串和'VBA'函数 - 这里有一个参考来开始你:(http://social.msdn .microsoft.com/Forums/sqlserver/en-US/71c81d1b-323e-48ef-a183-1b53ca2eb33d/dateadd-datepart-in-mdx?forum = sqlanalysisservices)可能更容易在SSAS和SQL-Server之间创建链接服务器,然后使用T-SQL函数'OPENQUERY'将数据提取到sql,然后开始玩弄它。 – whytheq

+0

(p。在日期维度中的差距是非常糟糕的设计) – whytheq