SSAS Cube中MDX计算日期转换错误排查求助
MDX日期字符串提取问题解决
问题根源
你当前的MID函数用了硬编码的起始位置44,但成员的UniqueName长度并非固定值(比如维度名大小写、层级名称差异都可能改变字符串长度),导致提取的内容为空或无效,拼接后出现T00:00:00这种无法转换为日期的字符串,最终触发报错。
正确的成员日期提取方法
MDX中无法直接使用正则,但可以通过动态定位&[(成员键的起始标记)和T(日期与时间的分隔符)的位置,精准提取yyyy-mm-dd部分:
- 用
InStr函数找到成员UniqueName中&[的索引,从该索引+2的位置开始,就是日期字符串的起点 - 再用
InStr找到T的位置,截取到该位置之前的内容,得到标准的yyyy-mm-dd格式字符串
修改后的MDX代码
测试用查询
SELECT [Measures].[Plan Revenue] ON COLUMNS, StrToMember( "[DIM Time_V3].[Year - Week - Date].[Month].&[" + Left( MID( MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), InStr(MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), "&[") + 2, 20 ), InStr( MID( MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), InStr(MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), "&[") + 2, 20 ), "T" ) - 1 ) + "T00:00:00]" ) ON ROWS FROM [FR_ACCOUNTING 3]
计算成员版本
( StrToMember( "[DIM Time_V3].[Year - Week - Date].[Month].&[" + Left( MID( MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), InStr(MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), "&[") + 2, 20 ), InStr( MID( MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), InStr(MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), "&[") + 2, 20 ), "T" ) - 1 ) + "T00:00:00]" ), [Plan Revenue] )
验证方法
可以先单独提取字符串部分,确认格式是否正确:
SELECT Left( MID( MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), InStr(MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), "&[") + 2, 20 ), InStr( MID( MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), InStr(MemberToStr([DIM Time_V3].[Year - Month - Day].CurrentMember), "&[") + 2, 20 ), "T" ) - 1 ) AS ExtractedDate ON COLUMNS FROM [FR_ACCOUNTING 3]
如果返回2023-01-03这类标准日期格式,说明提取逻辑正确。
内容的提问来源于stack exchange,提问作者hongyi jin
相关产品推荐
相关产品推荐

