逆引きFormula 2.0 に戻る

以下のような質問がありました。

年は式がありますし、月は12の剰余を取ればいいので簡単でしたが、最後の日付をどうやったら取得できるかを考えていました。取得した年と月をずらしてあげればよいのではと気づき、以下のような形で実装できました。一つずつの機能を確認していき、それらをまとめ上げて一つのフォーミュラにまとめてみます。要望通りのものが作れているのではないかと思います。Formula 2.0 で let が用意されたので、過去の日付を st に未来の日付を et に設定し、負の値の取り扱いをしないように変更します。

  1. ○年を取得 (常に正の値が出る)

    lets(
     /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
     ds, [prop("Start"), prop("End")].sort(),
     /* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/
     st, ds.first(),
     /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/
     et, ds.last(),
      /* et と st の間の年数を取得 */
      et.dateBetween(st, "years")
    )
    

    sortfirstlastdateBetween

  2. ○ヶ月を取得 (常に正の値が出る)

    lets(
     /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
     ds, [prop("Start"), prop("End")].sort(),
     /* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/
     st, ds.first(),
     /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/
     et, ds.last(),
      /* et と st の間の月数を取得 */
      et.dateBetween(st, "months") % 12
    )
    

    sortfirstlastdateBetween

  3. 1, 2 のオフセットをずらした日付を取得

    lets(
     /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
     ds, [prop("Start"), prop("End")].sort(),
     /* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/
     st, ds.first(),
      /* 1 で取得した年数を st に追加 */
       st.dateAdd(prop("year"), "years")
         /* 2 で取得した月数をさらに追加 */
         .dateAdd(prop("month"), "months")
    )
    

    sortfirstdateAdd

  4. オフセットをずらした日付と比較することで○日を取得 (常に正の値が出る)

    lets(
     /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
     ds, [prop("Start"), prop("End")].sort(),
     /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/
     et, ds.last(),
      /* et と year_month_add プロパティの間の日数を取得 */
      et.dateBetween(prop("year_month_add"), "days")
    )
    

    sortlastdateBetween

  5. ○年○ヶ月○日の文字列を作成 (1-4 を lets で変数化して一括作成)

    lets(
     /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */
     ds, [prop("Start"), prop("End")].sort(),
     /* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/
     st, ds.first(),
     /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/
     et, ds.last(),
     /* et と st の間の年数を取得し、変数 yd に代入 */
     yd, et.dateBetween(st, "years"),
     /* et と st の間の月数を取得し、変数 md に代入 */
     md, et.dateBetween(st, "months") % 12,
     /* yd の年数を st に追加、md の月数をさらに追加 */
     yma, st.dateAdd(yd, "years").dateAdd(md, "months"),
     /* et と yma の間の日数を取得 */
     dd, et.dateBetween(yma, "days"),
      (yd == 0 ? "" : yd.format() + "年")
      + (md == 0 ? "" : md.format() + "ヶ月")
      + dd.format() + "日"
    )
    

    sortfirstlastdateBetweendateAddformat==, equal?:, if+, add

日付間隔テスト