2013-03-21 188 views
3

親愛的朋友們,在MDX中將「YYYYMMDD」格式字符串轉換爲日期?

我在MDX中的「YYYYMMDD」格式字符串上應用日期相關函數時遇到了一些問題。例如,如果我有以下查詢:

with 
    member foo as WEEKDay("2013-03-21") 
select 
    foo on 0 
from 
    [Some Cube] 

它會正確輸出「5」爲foo在SSMS中。但是,如果我改變第二行:

member foo as WEEKDay("20130321") 

不幸的是,它會拋出「類型不匹配」的錯誤。

所以我想要做的是將字符串轉換爲一些可識別的日期格式,然後在其上應用函數。任何關於最簡單方法的想法,例如使用現有的功能?

請注意該字符串實際上是從運行MDX的任何立方體中的成員輸入的。所以字符串格式可以是可識別的,例如「YYYY-MM-DD」。所以硬編碼的字符串轉換算法可能不行。

非常感謝!

乾杯

回答

1

主題太舊了,但也許這可以幫助別人。技術非常粗暴,但可擴展。

with 
    member foo_false as WeekDay("20130321") 
    member foo_true as WeekDay("2013-03-21") 
    member foo_brute as 
    case when IsError(WeekDay("20130321"))=False then WeekDay("20130321") else 
     case 
     /* YYYYMMDD */ 
     when 
     IsError(WeekDay("20130321"))=True AND IsNumeric("20130321")=True 
     and IsError(WeekDay(Left("20130321",4)+'-'+Right(Left("20130321",6),2)+'-'+Right("20130321",2)))=False 
      then WeekDay(Left("20130321",4)+'-'+Right(Left("20130321",6),2)+'-'+Right("20130321",2)) 

     /* DDMMYYYY */ 
     when 
     IsError(WeekDay("20130321"))=True AND IsNumeric("20130321")=True 
     and IsError(WeekDay(Right("20130321",4)+'-'+Right(Left("20130321",4),2)+'-'+Left("20130321",2)))=False 
      then WeekDay(Right("20130321",4)+'-'+Right(Left("20130321",4),2)+'-'+Left("20130321",2)) 

     /* MMDDYYYY */ 
     when 
     IsError(WeekDay("20130321"))=True AND IsNumeric("20130321")=True 
     and IsError(WeekDay(Right("20130321",4)+'-'+Left("20130321",2)+'-'+Right(Left("20130321",4),2)))=False 
      then WeekDay(Right("20130321",4)+'-'+Left("20130321",2)+'-'+Right(Left("20130321",4),2)) 

     /* Unsupported Message */ 
     else "Unsupported Format" end 
    end 
select 
    {foo_false,foo_true,foo_brute} on 0 
from 
    [DATA Cube] 

添加可支持的格式,以結束之前「不支持」,則使用任何輸入字符串而不是"20130321"

但最簡單的方法是在插入到MDX之前使用其他圖層(例如SQL函數CONVERT),如果可能的話。

0

可以使用vba函數isDate來檢查傳遞的日期是否格式良好。如果不是,則首先使用dateserialmid格式化並使用它們。

with 
member foo as "20130321" 

member bar as 
iif(vba!isdate(foo) = TRUE, 
    WEEKDay(foo), //--if the date is already well formatted, it can be used 
    WEEKday(vba!dateserial(vba!mid(foo, 0, 4), vba!mid(foo, 5, 2), vba!right(foo, 2)))) 
select 
    bar on 0 
from 
    [some cube] 

EDIT

上面的代碼可以被修改以適應其它的檢查如MMDDYYYYDDMMYYYY,但事情是它在很多情況下是不可能的發動機直觀地知道,如果通過的值是YYYYMMDDDDDDMMYYYYMMDDYYYY。以字符串爲例1111111

這可以很容易地在任何日期格式,因爲它是一個有效的日期,無論你打破它。

我建議你有另一個可以存儲日期格式的成員。以這種方式看這個成員,字符串可以被解析。

例如

with 
member foo as 
// "20130321" //YYYYMMDD 
// "03212013"//MMDDYYYY 
"21032013"//DDMMYYYY 

MEMBER dateformat as "ddmmyyyy" 



member bar as 
iif(vba!isdate(foo) = TRUE, 
    WEEKDay(foo), 
    IIF(dateformat = "yyyymmdd", //YYYYMMDD 
     WEEKday(vba!dateserial(vba!mid(foo, 0, 4), vba!mid(foo, 5, 2), vba!right(foo, 2))), 
     IIF(dateformat = "mmddyyyy", //MMDDYYYY 
      WEEKday(vba!dateserial(right(foo, 4), vba!mid(foo, 0, 2), vba!mid(foo, 3, 2))), 
      IIF(dateformat = "ddmmyyyy", //DDMMYYYY 
       WEEKday(vba!dateserial(right(foo, 4), vba!mid(foo, 3, 2), vba!mid(foo, 0, 2))), 
       null 
       ) 
      ) 
     ) 
    ) 

select 
    bar on 0 
from 
    [aw cube] 
相關問題