วันจันทร์ที่ 26 เมษายน พ.ศ. 2553

MDX Query : Getdate()

บทความนี้จะอธิบายถึงวิธีการใช้งาน Function Getdate() ใน MDX Query
ปกติหากจะหาวันที่ปัจจุบันใน SQL Server จะใช้ Function Getdate() และจัด Format ตามต้องการ
เช่น  SELECT Convert(char(8),Getdate(),112)
แต่หากเป็นใน MDX Quey แล้ว จะแตกต่างกันไปนิดหน่อยโดยใช้ Function NOW() แทนครับ
ดูตามตัวอย่าง และนำไปประยุกต์ใช้เอาตามชอบใจ


WITH
MEMBER [Measures].[CurYear] as -- Current Year (Full)
Format(NOW(), "yyyy" )
MEMBER [Measures].[CurYearShot] as -- Current Year (With 2 digits)
Format(NOW(), "yy" )
MEMBER [Measures].[CurMonthFull] as -- Current Month (Full)
Format(NOW(),"MMMM")
MEMBER [Measures].[CurMonthNum] as -- Current Month (With 2 digits)
Format(NOW(),"MM")
MEMBER [Measures].[CurDateNum] as -- Current Date (With 2 digits)
Format(NOW(),"dd")
MEMBER [Measures].[CurDateFull] as -- Current Date
Format(NOW(),"d")
MEMBER [Measures].[CurDateFullFormat] as -- Current Date (With custom format)
Format(NOW(),"dd/MM/yyyy")
MEMBER [Measures].[PrvYear] as -- Previous Year
Format(DATEADD("yyyy",-1,NOW()),"yyyy")
MEMBER [Measures].[NxtYear] as -- Next Year
Format(DATEADD("yyyy",1,NOW()),"yyyy")
MEMBER [Measures].[PrvMonth] as -- Previous Month
Format(DATEADD("m",-1,NOW()),"MMMM")
MEMBER [Measures].[NxtMonth] as -- Next Month
Format(DATEADD("m",1,NOW()),"MMMM")
MEMBER [Measures].[PrvDate] as -- Previous Day
Format(DATEADD("d",-1,NOW()),"dd")
MEMBER [Measures].[NxtDate] as -- Next Day
Format(DATEADD("d",1,NOW()),"dd")
MEMBER [Measures].[YearDiff] as -- Difference between 2 years
DATEDIFF("yyyy",DATEADD("yyyy",-1,NOW()),DATEADD("yyyy",3,NOW()))
MEMBER [Measures].[ConvertStrToDate] as -- Convert String to Date
Cdate("1/28/2010")
select {[Measures].[CurYear],[Measures].[CurYearShot],[Measures].[CurMonthFull],[Measures].[CurMonthNum],
[Measures].[CurDateNum],[Measures].[CurDateFull],[Measures].[CurDateFullFormat],
[Measures].[PrvYear],[Measures].[NxtYear],[Measures].[PrvMonth],[Measures].[NxtMonth],
[Measures].[PrvDate],[Measures].[NxtDate], [Measures].[YearDiff],
[Measures].[ConvertStrToDate]} ON 0
FROM [Adventure Works]

3 ความคิดเห็น:

  1. ไม่ระบุชื่อ30 กันยายน 2553 เวลา 22:03

    เป็นประโยชน์มากๆเลยค่ะ ขอบคุณมากค่ะ
    มีคำถามจะสอบถามหน่อยน่ะค่ะ คือว่าถ้าหาเราจา pass parameter ที่เป็น Date ใน MDX Query มีวิธีการเขียนยังไงบ้างค่ะ
    ยกตัวอย่าง Query SQL ดังนี้ค่ะ
    Select c_pallet_no
    , d_pallet_date
    From st_pallet
    Where d_pallet_date between to_date(s_date,'dd/mm/yyyy')
    and to_date(e_date,'dd/mm/yyyy')
    ซึ่ง s_date และ e_date เป็น parameter ที่ส่งค่าเข้ามาน่ะค่ะ
    ถ้าหากเขียนเป็น MDX Query ต้องเขียน syntax ประมาณไหนคะ
    รบกวนด้วยนะคะ ขอบคุณล่วงหน้าค้า

    ตอบลบ
  2. ไม่แน่ใจว่าความหมายที่ต้องการคือ เหมือนกับการเขียน TSQL
    ใน SQL Server หรือป่าวนะ่ครับ เช่น Declare ตัวแปรแล้ว
    Set ค่าตัวแปรตามต้องการแล้วให้ Query execute โดยรับข้อมูลจากตัวแปรที่ประกาศเข้าไป ถ้าแบบนั้น MDX ทำไม่ได้โดยตรงนะครับ
    ต้องผ่านตัว Reporting service หรือใช้ OPENROWSET แทน
    ถ้าใช่กรณีนี้ลองดูที่นี่ครับ
    http://timlaqua.com/2008/07/dynamic-mdx-queries-in-tsql/


    แต่ MDX query ค่อนข้างจะแตกต่างกับ SQL Query ปกตินะครับ
    ผมไม่แน่ใจว่าคุณใช้ MDX query มานานหรือยัง เพราะมันเป็นเรื่องของ Dimension ของข้อมูล อย่างกรณีเรื่องวันที่ที่ต้องการ Filter นั้นจริง ๆ แล้วก็ต้องดูอีกว่า Dimension Date ที่ Design ในตัว Cube นั้น Designไว้อย่างไร ใช้อะไรเป็น Key ซึ่งจะเป็นตัวที่ใช้จริง ๆเวลา Query ยกตัวอย่างนะครับ จาก Adventurework



    SELECT
    [Measures].[Order Count] ON Columns,
    [Product].[Category].MEMBERS ON Rows
    FROM [Adventure Works]
    WHERE
    (
    [Date].[Date].&[1] -- FROM Start Date (July 1 2001)
    : --- BETWEEN Symbole
    [Date].[Date].&[10] -- TO End Data (July 10 2001)
    )

    จะเป็นว่าวันที่ที่ใช้ใน Query ไม่ได้เป็นรูปแบบของวันที่จริงๆแต่เป็น ID ของ Table ที่เก็บข้อมูล Dimension วันที่น่ะครับ
    นอกจากนั้นยังมีเรื่องของ Attribute ต่างๆ อีกเช่น เดือน ปี วัน(อาทิตย์ - เสาร์) ประมาณนั้นครับ

    ตอบลบ
  3. ไม่ระบุชื่อ3 ตุลาคม 2553 เวลา 20:37

    พอดีฉันเพิ่งเริ่มศึกษาเกี่ยวกับ MDX ค่ะ โดย Tool ที่ใช้จะเป็น Pentaho :Design Studio น่ะค่ะ ซึ่งตัวนี้จะเป็นตัวที่ pass parameter ส่งไปเรียกใช้งาน Cube อีกที ล่ะปัญหาที่เจอตอนนี้คือ การเขียน MDX เพื่อ pass parameter เป็นช่วงนั้น เมื่อส่งไปเรียก cube แล้ว แต่กลับมองเห็นค่าเป็น null น่ะค่ะ เลยไม่แน่ใจว่าจะต้องเขียน MDX Query ในรูปแบบไหนถึงจะถูกต้องค่ะ y_y ขอบคุณมากๆนะคะ สำหรับคำแนะนำ
    ตัวอย่างที่ลองเขียนมีดังนี้ค่ะ
    with member [Date Dimension.Date].[CriteriaDate] as 'Aggregate({[Date Dimension.Date].[All Dates].[{pdate_start}]:[Date Dimension.Date].[All Dates].[{pdate_end}]})'

    select NON EMPTY {[Measures].[QTY]} ON COLUMNS,
    NON EMPTY {([SalesOrder Dimension.Order Hierarchy].[All Orders], [Store Dimension .Store #].[All Stores], [Time Dimension .Time Hierarchy ].[Grand Total])} ON ROWS
    from [OrdersbyClient Cube]
    where [Date Dimension.Date].[CriteriaDate]
    ---------------
    จะเห็นว่า {pdate_start} และ {pdate_end} ทั้งสองค่าที่ส่งไปตอนเรียก Qube จะมีค่าเป็น null น่ะค่ะ - -''

    ตอบลบ