DATEDIFF 복귀 만들기 | Power Query

2020/9/7 업데이트 : 버전 2 코드를 수정했습니다.
2020/2/11 갱신 : 에러 발행이나 인수의 드롭 다운등에 대응한 버젼을 추가했습니다.
공식 함수에 없지만 Power Query 내에서 처리하는 경우 경과 연월이 필요할 수 있습니다.
개인적으로는 월수가 나오고 싶기 때문에, 만들고 있었습니다.

코드



인수의 interval에는 y, m, d의 3 종류를 넣거나 생략해 주세요.
인터벌을 넣지 않는 경우는, 연・월・일의 3종류 각각의 베이스로의 결과를 돌려주는 사양으로 해 보았습니다.
필요 없을까.
※클릭하면 열립니다.

코드 1
(date1 as date,date2 as date,optional interval as text)=>

//check the argument―"interval"
if List.Contains({"y","m","d",null},interval) then

    let 
        Difference =[Year =Date.Year(date2)-Date.Year(date1),
                     Month =Date.Month(date2)-Date.Month(date1),
                     day =Date.Day(date2)-Date.Day(date1)],

        MonthAdjustment= if Difference[day]<0 then -1 else 0,

        Answers =[
                  d = Duration.Days(date2-date1),
                  m = Difference[Year]*12+Difference[Month]+MonthAdjustment,
                  y = Difference[Year]
                      +(if (Difference[Month]+MonthAdjustment) <0 then -1 else 0)
                 ],

        Answer = if interval =null then Answers
                 else Record.Field(Answers,interval)
    in
        Answer

else "intervalはy,m,dのいずれかを指定するか、省略してください。"


메모


  • 「일」단위 이하는, Duration 함수군이 있으므로, 그쪽을 사용합시다.
  • github 등에도 몇 가지 작례가 나왔을 것입니다.
  • DAX에는 DATEDIFF 함수가 있습니다.
  • 풀다운으로 인수를 선택하게 된다면 최고입니다만, 원래 할 수 있을지 어떨지 모르기 때문에, if로 에러 회피했습니다.

  • 추기분



    공부하고 나서 손을 넣었습니다. 코드가 길지만 반 정도는 설례 등에 의한 것입니다.
    덧붙여 Excel의 워크 시트와 같이, 예상외의 인수가 들어갔을 경우에는 에러 처리하도록 수정했습니다.

    코드 2(강화판)



    fx_DateDiff_PQ
    let
        BodyOfFunction=    
        (date1 as date,date2 as date, optional interval as text)=>
        let 
            Difference =[Year =Date.Year(date2)-Date.Year(date1),
                         Month =Date.Month(date2)-Date.Month(date1),
                         day =Date.Day(date2)-Date.Day(date1)],
            MonthAdjustment= if Difference[day]<0 then -1 else 0,
            Answers =[
                      d = Duration.Days(date2-date1),
                      m = Difference[Year]*12+Difference[Month]+MonthAdjustment,
                      y = Difference[Year]
                          +(if (Difference[Month]+MonthAdjustment) <0 then -1 else 0)
                     ],
            Answer = if (date1<=date2) and List.Contains({"y","m","d",null},interval) then
                        if interval =null then Answers
                        //2020/9/7修正
                        else  Record.Field(Answers,interval)
                     else ...
        in
            Answer,
    
        //3番目の引数に係るドロップダウンリストを定義
        IntervalType =type text
                          meta [Documentation.AllowedValues = {"y","m","d"}],
    
        //関数自体の説明書き,設例
        NewFunctionType =type function(date1 as date,date2 as date, optional interval as IntervalType) as any
                            meta[Documentation.Name ="fx_DateDiff_PQ",
                                 Documentation.LongDescription=
                                        "<code>date1</code>から<code>date2</code>の期間に係るデータを取り出します。"
                                      & "<code>interval</code>を省略した場合は、年月日の3種類すべての結果をレコードで返します。",
                                 Documentation.Examples=
                                        {
                                             [
                                              Description="2019/12/29から2020/2/29の月数を求めます。日の部分が同じため丁度2か月扱いとなります。",
                                              Code ="fx_DateDiff_PQ(#date(2019,12,29),#date(2020,2,29),""m"")",
                                              Result ="2"
                                             ],
                                             [
                                              Description="2019/12/29から2020/2/29の期間情報を求めます。<code>interval</code>を省略します。",
                                              Code ="fx_DateDiff_PQ(#date(2019,12,29),#date(2020,2,29))",
                                              Result ="[d=62,m=2,y=0]"
                                             ]
    
                                        }
                                ],
        ReplaceType =Value.ReplaceType(BodyOfFunction,NewFunctionType)
    in
        ReplaceType
    

    완성의 모습



    강화판의 함수는, 상세 에디터에 붙이면 이런 느낌이 됩니다.


    참고



    드롭다운은 UI 상의 이야기만으로, 거기에 규정하고 있지 않은 값도 받아들이게 되어 버립니다.
    그 때문에, 드롭 다운 처리와는 별도로, 에러를 내도록(듯이) 하고 있습니다.
    에러 메시지는, 또 이번이라고 하는 것으로.

    참고



    Writing documentation for custom M-functions, Part1 | THE SELF-SERVICE-BI BLOG

    Chris Webb's BI Blog: Specifying Allowed Values, Sample Values ​​and Descriptions For Function Parameters In Power Query–Part 1 Chris Webb's BI Blog

    좋은 웹페이지 즐겨찾기