MDX 语言独立日期比较
MDX language independent date comparison
简而言之:我输入的日期 属性 需要与 now() 进行比较,但是必须在两个不同的环境(语言设置)中进行比较。
我有以下代码:
with
member [Measures].[Opening] as
CDate([Store].[Store].Properties('Opening')) // works with the english date
member [Measures].[Opening] as // works with the german date
DateSerial(
Right([Store].[Store].Properties('Opening'),4),
Mid([Store].[Store].Properties('Opening'),4,2),
Left([Store].[Store].Properties('Opening'),2)
)
member [Measures].[IsOpen] as
CASE
WHEN [Measures].[Opening] < NOW()
THEN 1
ELSE 0
END
[Store].[Store].Properties('Opening')
是一个日期。
但是有两个服务器具有不同的语言设置,这必须 运行 打开。一个返回,例如02.10.2009 和另一个 10/2/2009 用于 [Opening]。
我需要找到适用于两种环境的解决方案。 (但无法更改语言设置)
我尝试使用 FORMAT_STRING 或 LANGUAGE 进行格式化,但始终没有成功。
一个可能的想法是:
VBA!cdate(
format(
VBA!cdate([Store].[Store].Properties('Opening')),
"dd MMMM yyyy"
)
)
很多仓库使用整数作为它们的日期键 - 那么服务器的日期格式会稍微无关紧要,因为您可以使用这种结构:
MEMBER [Measures].[Date as int] as
[Date].[Date].CURRENTMEMBER.Properties('Key0', Typed)
MEMBER [Measures].[Date Year] as
Fix([Measures].[Date as int] / 10000)
MEMBER [Measures].[Date Month] as
Fix(([Measures].[Date as int] - [Measures].[Date Year] * 10000) / 100)
MEMBER [Measures].[Date Day] as
[Measures].[Date as int] - [Measures].[Date Year] * 10000 - [Measures].[Date Month] * 100
MEMBER [Measures].[DateValue_attempt1] as
// convert it to Date data type and use a format string on that:
DateSerial([Measures].[Date Year], [Measures].[Date Month], [Measures].[Date Day]),
format_string = 'dd.MM.yyyy'
MEMBER [Measures].[DateValue_attempt2] as
//if above fails maybe just convert it to string & do further conversion in client
[Measures].[Date Day] + "." +
[Measures].[Date Month] + "." +
[Measures].[Date Year]
但对您来说,一个解决方法可能是检测第三个字符是什么,然后使用 IIF
或 CASE
:
WITH
MEMBER [Measures].[Opening] AS
IIF(
Mid([Store].[Store].Properties('Opening'),3,1) = '.'
,DateSerial(
Right([Store].[Store].Properties('Opening'),4),
Mid([Store].[Store].Properties('Opening'),4,2),
Left([Store].[Store].Properties('Opening'),2)
)
,CDate([Store].[Store].Properties('Opening'))
)
简而言之:我输入的日期 属性 需要与 now() 进行比较,但是必须在两个不同的环境(语言设置)中进行比较。
我有以下代码:
with
member [Measures].[Opening] as
CDate([Store].[Store].Properties('Opening')) // works with the english date
member [Measures].[Opening] as // works with the german date
DateSerial(
Right([Store].[Store].Properties('Opening'),4),
Mid([Store].[Store].Properties('Opening'),4,2),
Left([Store].[Store].Properties('Opening'),2)
)
member [Measures].[IsOpen] as
CASE
WHEN [Measures].[Opening] < NOW()
THEN 1
ELSE 0
END
[Store].[Store].Properties('Opening')
是一个日期。
但是有两个服务器具有不同的语言设置,这必须 运行 打开。一个返回,例如02.10.2009 和另一个 10/2/2009 用于 [Opening]。
我需要找到适用于两种环境的解决方案。 (但无法更改语言设置)
我尝试使用 FORMAT_STRING 或 LANGUAGE 进行格式化,但始终没有成功。
一个可能的想法是:
VBA!cdate(
format(
VBA!cdate([Store].[Store].Properties('Opening')),
"dd MMMM yyyy"
)
)
很多仓库使用整数作为它们的日期键 - 那么服务器的日期格式会稍微无关紧要,因为您可以使用这种结构:
MEMBER [Measures].[Date as int] as
[Date].[Date].CURRENTMEMBER.Properties('Key0', Typed)
MEMBER [Measures].[Date Year] as
Fix([Measures].[Date as int] / 10000)
MEMBER [Measures].[Date Month] as
Fix(([Measures].[Date as int] - [Measures].[Date Year] * 10000) / 100)
MEMBER [Measures].[Date Day] as
[Measures].[Date as int] - [Measures].[Date Year] * 10000 - [Measures].[Date Month] * 100
MEMBER [Measures].[DateValue_attempt1] as
// convert it to Date data type and use a format string on that:
DateSerial([Measures].[Date Year], [Measures].[Date Month], [Measures].[Date Day]),
format_string = 'dd.MM.yyyy'
MEMBER [Measures].[DateValue_attempt2] as
//if above fails maybe just convert it to string & do further conversion in client
[Measures].[Date Day] + "." +
[Measures].[Date Month] + "." +
[Measures].[Date Year]
但对您来说,一个解决方法可能是检测第三个字符是什么,然后使用 IIF
或 CASE
:
WITH
MEMBER [Measures].[Opening] AS
IIF(
Mid([Store].[Store].Properties('Opening'),3,1) = '.'
,DateSerial(
Right([Store].[Store].Properties('Opening'),4),
Mid([Store].[Store].Properties('Opening'),4,2),
Left([Store].[Store].Properties('Opening'),2)
)
,CDate([Store].[Store].Properties('Opening'))
)