2016-04-01 5 views
1

Kurz gesagt: Ich habe eine Datum type Eigenschaft, die ich jetzt vergleichen muss(), aber zwei verschiedene Umgebungen (Spracheinstellungen), wo dieser Vergleich funktionieren muss.MDX sprachunabhängigen Datumsvergleich

Ich habe den folgenden Code:

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') ist ein Datum.

Aber es gibt zwei Server mit verschiedenen Spracheinstellungen, auf denen dies ausgeführt werden muss. Einer, der z.B. 02.10.2009 und der andere 02.10.2009 für [Eröffnung].

Ich muss eine Lösung finden, die für beide Umgebungen funktioniert. (Aber kann die Spracheinstellungen nicht ändern)

Ich habe versucht, mit FORMAT_STRING oder Sprache formatieren, aber hatte keinen Erfolg was auch immer.

+0

Welche meiner Schnipsel haben geholfen? – whytheq

+0

der dritte half. –

Antwort

1

Eine mögliche Idee ist folgende:

VBA!cdate(
    format(
     VBA!cdate([Store].[Store].Properties('Opening')), 
     "dd MMMM yyyy" 
    ) 
) 

Viele Lager verwenden ganze Zahlen als Datum Schlüssel - dann das Datumsformat des Servers leicht irrelevent sein würde, wie Sie diese Art von Konstruktion verwenden:

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] 

Aber ein bisschen eine Abhilfe könnte für Sie sein zu erkennen, was das dritte Zeichen ist und verwenden Sie dann IIF oder 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')) 
     )