Reporting services MDX查询中的SSRS小于运算符

Reporting services MDX查询中的SSRS小于运算符,reporting-services,mdx,olap,ssrs-2012,olap-cube,Reporting Services,Mdx,Olap,Ssrs 2012,Olap Cube,我想报告小于特定(参数化)日期的日期。但这不亚于运营商 我选择了范围(包括)并检查了参数。我已经将文本参数转换为DateTime[根据本文] () 这是我问题的一部分 SELECT ( STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) : STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED) ) ON COLU

我想报告小于特定(参数化)日期的日期。但这不亚于运营商

我选择了范围(包括)并检查了参数。我已经将文本参数转换为DateTime[根据本文] ()

这是我问题的一部分

SELECT (
        STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) 
        : 
        STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED) 
       ) ON COLUMNS
我已将
FromWorkItemSystemCreatedDate
参数隐藏,并将其默认值设置为min date

当我选择了一个不存在于
ToWorkItemSystemCreatedDate
中的日期时。它给出了错误。 例如,我的表有3项。它们的创建日期

01.01.2015,
02.01.2015,
03.01.2015,
当我从WorkItemSystemCreatedDate中选择
作为
03.01.2015
时,它会工作(返回2项)。但是当我选择
10.01.2015
时,我得到一个错误,因为没有项目
10.01.2015


有没有办法实现“创建日期<参数值”?

首先,您需要检查
@ToWorkItemSystemCreatedDate
参数是否获取“实际”日期。如果没有,您就不能使用它,因为该成员不存在。 在这种情况下,您需要选择从
@FromWorkItemSystemCreatedDate
开始到结束的所有日期(即null)

编辑 以上假设迄今为止的
始终在范围内或大于最大日期

但这可能需要一些调整

  • 用户意外给出的日期小于Dates表中的最小日期

  • 截止日期
    大于最小日期,小于较大日期,但不在范围内。当日期表中存在空白时,就会发生这种情况

  • 在这种情况下,您应该声明一个附加(隐藏)参数,并将其设置为dates表中可能的最大日期。我不会深入讨论这个问题,因为您已经具备了将参数设置为最小日期的逻辑。逻辑几乎是一样的

    在上述两种情况下,您可能希望引发错误。使用
    DateDiff
    函数得出结论

    假设捕获最大创建日期的另一个参数是
    @FromWorkItemSystemCreatedMaxDate

    完整的查询将是:

    WITH MEMBER measures.existingdate as
    IIF(
        ISSIBLING    //Check whether the "To" date exists!
            ( 
            STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED),
            STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED)
             ) = True,   
         1,
         NULL
       )
    
    MEMBER Measures.IsBackDated AS
    IIF(
        measures.existingdate = NULL AND DateDiff( //Date not in table is lesser than the minimum
                                                 "d", 
                                                 STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED), 
                                                 STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED)
                                                 ) > 0 ,
        1,
        IIF(
            measures.existingdate = NULL AND DateDiff( //Date not in table and is greater than the maximum
                                                 "d", 
                                                 STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED), 
                                                 STRTOMEMBER(@FrontWorkItemSystemCreatedMaxDate, CONSTRAINED)
                                                 ) > 0 ,
            -1, //will return -1 in this case
            2//When the date is greater than minimum, 
             //smaller than maximum(when there are "holes" in dates table)
           )
       )
    
    select 
        IIF(
            measures.existingdate = 1,
            STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) : STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED),
            IIF( //Nested IIF to check for date greater than max date
                Measures.IsBackDated = -1,
                {STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) : NULL}, //Measures.IsBackDated = -1
                null
               )
    
           ) ON 0,         
        {} ON 1
    from [YourCube]
    
    您可以自由地使用这些度量值并修改查询以向最终用户返回合适的消息,或者您甚至可以考虑进一步修改查询并显示您想要的内容。只要我的两分钱

    WITH MEMBER measures.existingdate as
    IIF(
        ISSIBLING    //Check whether the "To" date exists!
            ( 
            STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED),
            STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED)
             ) = True,   
         1,
         NULL
       )
    
    MEMBER Measures.IsBackDated AS
    IIF(
        measures.existingdate = NULL AND DateDiff( //Date not in table is lesser than the minimum
                                                 "d", 
                                                 STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED), 
                                                 STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED)
                                                 ) > 0 ,
        1,
        IIF(
            measures.existingdate = NULL AND DateDiff( //Date not in table and is greater than the maximum
                                                 "d", 
                                                 STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED), 
                                                 STRTOMEMBER(@FrontWorkItemSystemCreatedMaxDate, CONSTRAINED)
                                                 ) > 0 ,
            -1, //will return -1 in this case
            2//When the date is greater than minimum, 
             //smaller than maximum(when there are "holes" in dates table)
           )
       )
    
    select 
        IIF(
            measures.existingdate = 1,
            STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) : STRTOMEMBER(@ToWorkItemSystemCreatedDate, CONSTRAINED),
            IIF( //Nested IIF to check for date greater than max date
                Measures.IsBackDated = -1,
                {STRTOMEMBER(@FromWorkItemSystemCreatedDate, CONSTRAINED) : NULL}, //Measures.IsBackDated = -1
                null
               )
    
           ) ON 0,         
        {} ON 1
    from [YourCube]