最近、日付を開始日と終了日を指定して検索する機能を設計することがありました。
はじめは簡単かなと思っていましたが、少し悩むこともあったのでまとめておきます。

期間検索とは

対象とする機能は、日付を持つデータについて開始日と終了日を指定して期間内に入る場合は検索結果に表示するというものです。
例えば、データが一覧表示されており、各レコードには作成日時があるとします。検索条件として開始日と終了日を指定して検索すると、条件に合致するレコードのみが表示されます。

考慮すべき事項

単純そうな機能ですが、実装においてはいくつか考慮すべき事項があります。

期間のバリデーション

検索条件として指定する開始日と終了日には不正な値が設定されてしまうことがあります。

利用するUIライブラリによりますが、日付として不正な値が入力された状態で検索ボタンが押下されることがあるかもしれません。(2025/01/__のように年月のみなど)
この状態では条件を確定できず検索できないため、はじめにバリデーションチェックして処理を中断する必要があります。

また、開始日と終了日の大小関係が誤って指定される可能性もあります。
例えば、開始日 > 終了日(例:開始日 = 2025/05/05, 終了日 = 2025/05/01)となってしまう場合です。これでは検索しても合致するデータは存在しないので事前にチェックしてバリデーションエラーとする必要があります。

似たようなケースで、開始日 = 終了日の場合があります。
これは検索条件として許容(検索できる)する必要があるかと思います。特定の日付のみのデータを検索したいといったニーズを満たすためには、このような形式で指定する必要があるためです。

テストケース

テストケースとしては、境界値などを考慮して以下のケースが考えられます。

↓データの日付/検索条件→ 2025/05/15〜(終了日未指定) 2025/05/15〜2025/05/15 2025/05/15〜2025/05/20 (開始日未指定)〜2025/05/20 備考
2025/5/14 表示 開始日未満
2025/5/15 表示 表示 表示 表示 開始日と一致、開始日=終了日に該当
2025/5/17 表示 表示 表示 期間内
2025/5/20 表示 表示 表示 終了日と一致
2025/5/21 表示 終了日超過
未指定 いずれにも合致しない

バグとして考えられるのは、開始日と終了日に同一日付を指定した場合に検索結果が0件となってしまう場合です。
画面上は日付のみ表示していても、DBには時刻情報も保持していることが多いです。このとき、DBに保存された時刻が00:00:00でない場合、期間の条件に合致せず結果が表示されません。(2025/05/15 00:00:00〜2025/05/15 00:00:00で検索したが、データは2025/05/15 09:00:00となっているなど)

まとめ

日付の期間検索を行う機能の設計を考えてみました。
バリデーションエラーとしては、日付として不正、開始日と終了日の大小関係が誤っているケースを考える必要があると思います。
テストでは、境界値を考慮してテストケースを作成してチェックします。開始日と終了日に同一日を指定して検索した場合に正しく表示されるかも確認したいです。