📅

日付の間隔を○年○ヶ月○日と表示するには?

Status
Update by 2.0
属性名
○年○ヶ月○日
返り値
String
逆引きNotionDB
関連するもの
以下のような質問がありました。
年は式がありますし、月は12の剰余を取ればいいので簡単でしたが、最後の日付をどうやったら取得できるかを考えていました。取得した年と月をずらしてあげればよいのではと気づき、以下のような形で実装できました。一つずつの機能を確認していき、それらをまとめ上げて一つのフォーミュラにまとめてみます。要望通りのものが作れているのではないかと思います。Formula 2.0 で let が用意されたので、過去の日付を st に未来の日付を et に設定し、負の値の取り扱いをしないように変更します。
 
  1. ○年を取得 (常に正の値が出る)
    1. lets( /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */ ds, [prop("Start"), prop("End")].sort(), /* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/ st, ds.first(), /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/ et, ds.last(), /* et と st の間の年数を取得 */ et.dateBetween(st, "years") )
  1. ○ヶ月を取得 (常に正の値が出る)
    1. lets( /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */ ds, [prop("Start"), prop("End")].sort(), /* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/ st, ds.first(), /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/ et, ds.last(), /* et と st の間の月数を取得 */ et.dateBetween(st, "months") % 12 )
  1. 1, 2 のオフセットをずらした日付を取得
    1. lets( /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */ ds, [prop("Start"), prop("End")].sort(), /* 配列の先頭(過去の日付)を取り出し、変数 st に代入*/ st, ds.first(),  /* 1 で取得した年数を st に追加 */ st.dateAdd(prop("year"), "years") /* 2 で取得した月数をさらに追加 */ .dateAdd(prop("month"), "months") )
  1. オフセットをずらした日付と比較することで○日を取得 (常に正の値が出る)
    1. lets( /* 二つの日付の配列を作り、日付で並び替えて変数 ds に代入 */ ds, [prop("Start"), prop("End")].sort(), /* 配列の末尾(未来の日付)を取り出し、変数 et に代入*/ et, ds.last(), /* et と year_month_add プロパティの間の日数を取得 */ et.dateBetween(prop("year_month_add"), "days") )
  1. ○年○ヶ月○日の文字列を作成 (1-4 を lets で変数化して一括作成)
    1. 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
Aug 20, 2022
Aug 21, 2022
NaN
Aug 20, 2022 12:00 AM
Jul 31, 2022
Aug 1, 2022
NaN
Jul 31, 2022 12:00 AM
Jul 31, 2022
Aug 31, 2022
NaN
Jul 31, 2022 12:00 AM
Jun 30, 2022
Jul 30, 2022
NaN
Jun 30, 2022 12:00 AM
Jun 30, 2022
Jul 31, 2022
NaN
Jun 30, 2022 12:00 AM
May 31, 2022
Jun 30, 2022
NaN
May 31, 2022 12:00 AM
May 31, 2022
Jul 1, 2022
NaN
May 31, 2022 12:00 AM
Jan 31, 2022
Feb 28, 2022
NaN
Jan 31, 2022 12:00 AM
Jan 31, 2021
Mar 1, 2022
NaN
Jan 31, 2021 12:00 AM
Mar 1, 2022
Jan 31, 2021
NaN
Mar 1, 2022 12:00 AM
Feb 1, 2021
Jan 31, 2022
NaN
Feb 1, 2021 12:00 AM
Jan 31, 2022
Feb 1, 2021
NaN
Jan 31, 2022 12:00 AM