可以使用vba函數isDate
來檢查傳遞的日期是否格式良好。如果不是,則首先使用dateserial
和mid
格式化並使用它們。
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
上面的代碼可以被修改以適應其它的檢查如MMDDYYYY
或DDMMYYYY
,但事情是它在很多情況下是不可能的發動機直觀地知道,如果通過的值是YYYYMMDDDD
或DDMMYYYY
或MMDDYYYY
。以字符串爲例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]