日付範囲内に含まれることを確認するには?: Notion Formula 解説 (31)

はじめに

Notion Formula の第31回目は、「日付範囲内に含まれることを確認するには?」を解説します。実は、時刻が含まれる場合と含まれない場合で範囲判定が異なるので、意外と面倒です。この例については、こちらの逆引きで紹介しています。

数式

数式は以下のようになります。こちらも条件判断が多いので、順に式を確認していきます。

lets(
 /* 日付範囲プロパティの開始時刻を変数 st に代入 */
 st, prop("日付範囲").dateStart(),
 /* 日付範囲プロパティの開始時刻を変数 st に代入 */
 et, prop("日付範囲").dateEnd(),
 /* 終了時刻の調整(日付のみの場合に一日後に変更) */
 ret, et.hour() + et.minute() == 0 ? et.dateAdd(1, "days") : et,
  /* 日付範囲の開始時刻から事前準備した終了時刻の間に入っているかを確認 */
  (now() >= st) and (now() < et)
)

境界値で場合分けしてテストするため、以下のようなデータセットを用意しました。

種別 日付範囲 現在時刻
時間なし・終了日なし 2024年6月16日 2024年6月16日 5:00
時間なし・終了日 2024年6月15日 → 2024年6月16日 2024年6月16日 5:00
時間なし・開始日 2024年6月16日 → 2024年6月17日 2024年6月16日 5:00
時間なし・中間 2024年6月15日 → 2024年6月17日 2024年6月16日 5:00
時間なし・開始日以前 2024年6月14日 → 2024年6月15日 2024年6月16日 5:00
時間なし・終了日以降 2024年6月17日 → 2024年6月18日 2024年6月16日 5:00
時間あり・終了時刻なし 2024年6月16日 1:00 2024年6月16日 5:00
時間あり・終了時刻ちょうど 2024年6月16日 4:00 → 5:00 2024年6月16日 5:00
時間あり・中間 2024年6月16日 4:00 → 6:00 2024年6月16日 5:00
時間あり・開始時刻ちょうど 2024年6月16日 5:00 → 6:00 2024年6月16日 5:00
時間あり・開始時刻前 2024年6月16日 4:00 → 4:59 2024年6月16日 5:00
時間あり・終了時刻後 2024年6月16日 5:01 → 6:00 2024年6月16日 5:00

最初は、日付範囲の開始時刻と終了時刻をそれぞれ st と et に代入します。終了時刻が設定されていないものは、開始時刻と同じものが入ります。

lets(
 /* 日付範囲プロパティの開始時刻を変数 st に代入 */
 st, prop("日付範囲").dateStart(),
 /* 日付範囲プロパティの開始時刻を変数 st に代入 */
 et, prop("日付範囲").dateEnd(),
日付範囲 st et
2024年6月16日 2024年6月16日 2024年6月16日
2024年6月15日 → 2024年6月16日 2024年6月15日 2024年6月16日
2024年6月16日 → 2024年6月17日 2024年6月16日 2024年6月17日
2024年6月15日 → 2024年6月17日 2024年6月15日 2024年6月17日
2024年6月14日 → 2024年6月15日 2024年6月14日 2024年6月15日
2024年6月17日 → 2024年6月18日 2024年6月17日 2024年6月18日
2024年6月16日 1:00 2024年6月16日 1:00 2024年6月16日 1:00
2024年6月16日 4:00 → 5:00 2024年6月16日 4:00 2024年6月16日 5:00
2024年6月16日 4:00 → 6:00 2024年6月16日 4:00 2024年6月16日 6:00
2024年6月16日 5:00 → 6:00 2024年6月16日 5:00 2024年6月16日 6:00
2024年6月16日 4:00 → 4:59 2024年6月16日 4:00 2024年6月16日 4:59
2024年6月16日 5:01 → 6:00 2024年6月16日 5:01 2024年6月16日 6:00

時刻がない日付のみの場合は 0:00 と判定されます。このため最終日の 0:01 以降は範囲内と判定されません。そこで、時刻が設定されていない場合には、終了時刻を翌日の 0:00 (当日の24:00)に変換するようにします。時刻が設定されていない判定は時刻が 0:00 であることをチェックすればよいです。このため、hour() と minute() の合計が 0 であるか判定し、その場合には日付を 1 日追加しています。

 /* 終了時刻の調整(日付のみの場合に一日後に変更) */
 ret, et.hour() + et.minute() == 0 ? et.dateAdd(1, "days") : et,
日付範囲 et ret
2024年6月16日 2024年6月16日 2024年6月17日 0:00
2024年6月15日 → 2024年6月16日 2024年6月16日 2024年6月17日 0:00
2024年6月16日 → 2024年6月17日 2024年6月17日 2024年6月18日 0:00
2024年6月15日 → 2024年6月17日 2024年6月17日 2024年6月18日 0:00
2024年6月14日 → 2024年6月15日 2024年6月15日 2024年6月16日 0:00
2024年6月17日 → 2024年6月18日 2024年6月18日 2024年6月19日 0:00
2024年6月16日 1:00 2024年6月16日 1:00 2024年6月16日 1:00
2024年6月16日 4:00 → 5:00 2024年6月16日 5:00 2024年6月16日 5:00
2024年6月16日 4:00 → 6:00 2024年6月16日 6:00 2024年6月16日 6:00
2024年6月16日 5:00 → 6:00 2024年6月16日 6:00 2024年6月16日 6:00
2024年6月16日 4:00 → 4:59 2024年6月16日 4:59 2024年6月16日 4:59
2024年6月16日 5:01 → 6:00 2024年6月16日 6:00 2024年6月16日 6:00

最後に現在時刻(2024年6月15日 8:00)が含まれるかを確認します。現在時刻が開始時刻以降(開始時刻は含む)であり、終了時刻以前(終了時刻は含まない)であればよいことになります。

  /* 日付範囲の開始時刻から事前準備した終了時刻の間に入っているかを確認 */
  (now() >= st) and (now() < et)
)

二つの条件が満足しているかどうかをそれぞれの場合で確認します。条件が満足している部分を太字で示しています。

日付範囲 now() >= st now() < et ans
2024年6月16日 2024年6月16日 2024年6月17日 0:00 true
2024年6月15日 → 2024年6月16日 2024年6月15日 2024年6月17日 0:00 true
2024年6月16日 → 2024年6月17日 2024年6月16日 2024年6月18日 0:00 true
2024年6月15日 → 2024年6月17日 2024年6月15日 2024年6月18日 0:00 true
2024年6月14日 → 2024年6月15日 2024年6月14日 2024年6月16日 0:00 false
2024年6月17日 → 2024年6月18日 2024年6月17日 2024年6月19日 0:00 false
2024年6月16日 1:00 2024年6月16日 1:00 2024年6月16日 1:00 false
2024年6月16日 4:00 → 5:00 2024年6月16日 4:00 2024年6月16日 5:00 false
2024年6月16日 4:00 → 6:00 2024年6月16日 4:00 2024年6月16日 6:00 true
2024年6月16日 5:00 → 6:00 2024年6月16日 5:00 2024年6月16日 6:00 true
2024年6月16日 4:00 → 4:59 2024年6月16日 4:00 2024年6月16日 4:59 false
2024年6月16日 5:01 → 6:00 2024年6月16日 5:01 2024年6月16日 6:00 false

おわりに

今回は、「日付範囲内に含まれることを確認するには?」を解説しました。意外と境界値判定が難しいので、テストを細かく設定して確認しています。