逆引きFormula 2.0 に戻る
以下のような質問がありました。
年は式がありますし、月は12の剰余を取ればいいので簡単でしたが、最後の日付をどうやったら取得できるかを考えていました。取得した年と月をずらしてあげればよいのではと気づき、以下のような形で実装できました。一つずつの機能を確認していき、それらをまとめ上げて一つのフォーミュラにまとめてみます。要望通りのものが作れているのではないかと思います。Formula 2.0 で let が用意されたので、過去の日付を st に未来の日付を et に設定し、負の値の取り扱いをしないように変更します。
- ○年を取得 (常に正の値が出る)
lets( /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */ ds, [prop("Start"), prop("End")].sort(), /* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/ st, ds.first(), /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/ et, ds.last(), /* et と st の間の年数を取得 */ et.dateBetween(st, "years") )
- ○ヶ月を取得 (常に正の値が出る)
lets( /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */ ds, [prop("Start"), prop("End")].sort(), /* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/ st, ds.first(), /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/ et, ds.last(), /* et と st の間の月数を取得 */ et.dateBetween(st, "months") % 12 )
- 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") )
- オフセットをずらした日付と比較することで○日を取得 (常に正の値が出る)
lets( /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */ ds, [prop("Start"), prop("End")].sort(), /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/ et, ds.last(), /* et と year_month_add プロパティの間の日数を取得 */ et.dateBetween(prop("year_month_add"), "days") )
- ○年○ヶ月○日の文字列を作成 (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.empty() ? "" : yd + "年") + (md.empty() ? "" : md + "ヶ月") + (dd.empty() ? "" : dd + "日") )
日付間隔テスト
Name
Start
End
○年○ヶ月○日
yd
month
year_month_add
date