蒙德里安的日期范围

时间:2011-11-22 07:18:43

标签: mdx olap mondrian

我想将TimeStamp t1的数据提取到t2。但是t1和t2可能不一定在我的数据库表中。所以,我想要的是:它应该找到大于或等于t1的下一个可用时间戳(如果t1不在db表中,则为> t1,如果存在,则为t1),最后可用的时间戳小于或等于t2(如果t2不存在,则为< t2;如果db1查询本身存在,则为t2)。

.FirstSibling,.LastSibling,.FirstChild,.LastChild,.NextMember,.LastMember,HEAD,TAIL对我不起作用,因为我希望时间戳为> = t1和< = t2(两者均可用) D b)。 我该怎么办?

1 个答案:

答案 0 :(得分:0)

用MDX以这种方式摆弄日期可能会很痛苦。我过去做了类似的事情,将NameCaption转换为字符串/数字/日期,并将其与输入参数t1和t2进行比较(类似地转换为字符串/数字/日期)格式相同)。

也许t1是一个字符串“31/12/2010”,你的多维数据集包含[时间]等成员。[所有时间]。[2010]。[12月]。[29]那么你需要将两者转换成一种通用格式进行比较。 MDX提供了诸如MemberToStr()之类的方法,它们将为您提供.CurrentMember的字符串表示,并让您比较两者。

VBA函数可用于某些MDX版本,因此您可以使用ReplaceInStr来操作字符串,甚至可以调用CDate()之类的函数来获取其中的值与输入参数相同的形式。

你最终的MDX可能看起来像这样......虽然我已经大大简化了将成员的Caption变成CDate函数接受的字符串所需的操作:
SELECT
{Filter({[Time].[Day].members}, CDate([Time].CurrentMember.Caption) <= CDate("2010-12-31"))} ON ROWS,
[Measures].[Something] ON COLUMNS
FROM [CubeName]

ROWS子句首先在[Day]级别获取一组所有[Time]成员,然后过滤掉该组,只留下Caption(转换为日期对象)小于或等于的那些你的输入字符串(转换为日期对象)。