4

MDX の「YYYYMMDD」フォーマット文字列に日付関連の関数を適用する際に問題があります。たとえば、次のクエリがあるとします。

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

SSMS で foo の "5" を正しく出力します。しかし、2行目を次のように変更すると:

   member foo as WEEKDay("20130321")

残念ながら、「タイプの不一致」エラーがスローされます。

だから私がしたいのは、文字列を認識可能な日付形式に変換してから、それに関数を適用することです。既存の関数を使用するなど、最も簡単な方法のアイデアはありますか?

文字列は、MDX が実行されている任意のキューブのメンバーから実際に入力されることに注意してください。したがって、「YYYY-MM-DD」などの文字列形式は認識可能でした。そのため、ハードコーディングされた文字列変換アルゴリズムは適切ではない可能性があります。

4

3 に答える 3

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 など) を使用するのが最も簡単な方法です。

于 2015-01-27T15:10:46.663 に答える
0

ここでFooMemberは int であり、日付を表すためyyyyMMdd、次のコードを使用して Date に変換できます

   =Format(CDate(Left(CSTR(Fields!FooMember.Value),4)
   + "-" + Mid(CSTR(Fields!FooMember.Value), 5, 2)
   + "-" + Right(CSTR(Fields!FooMember.Value), 2)),
   "dd/MM/yyyy")

次のコードを使用してキューブで使用します

 Format(CDate(Left([Measures].[FooMember],4)
 + "-" + Mid([Measures].[FooMember], 5, 2)
 + "-" + Right([Measures].[FooMember], 2)),"yyyy/MM/dd")
于 2021-01-28T14:06:09.973 に答える