2016-04-01 4 views
1

Вкратце: у меня есть свойство, набранное по дате, которое мне нужно сравнить с now(), но в двух разных средах (языковых настройках), где это сравнение должно работать.MDX независимое сравнение даты

У меня есть следующий код:

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 для [Открытие].

Мне нужно найти решение, работающее в обеих средах. (Но не могу изменить настройки языка)

Я пробовал форматирование с помощью FORMAT_STRING или LANGUAGE, но не имел успеха, что так всегда.

+0

какой из моих отрывков помог? – whytheq

+0

третий помог. –

ответ

1

Возможным идея заключается в следующем:

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

Много складов используют целые числа, как их ключи даты - то формат даты сервера будет немного irrelevent, как вы могли бы использовать этот вид строительства:

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')) 
     )