時間範囲の重なりを考える。
予定表の追加の確認や、イベントの開催時間の確認、予約システムの確認や、会議室の予約など、時間範囲をリソースとして扱うことは多い。
そのリソースの時分割をどうやって判定するのかちょっと考えていた。
時間範囲の比較パターン 13個
それらのパターンに名前がないので、名前は、ウェブやgithubみながら、私が適当に考えた。名前くらいは自分で考えてみると面白い。*1
11パターン
先のパターンのうち、12,13は 、他パターン(8,9、3,6)に含まれるので、次の11種類に減らせる。
同時(=)は被ると判断するとー>7パターンへ
同時スタートや、終了直後にスタート、同時に終了は、同一時刻に間髪入れずに開始終了するので、同時は重複していると判断したほうが楽。同時は重複していると考えることが可能。つまり、パターン8・9は、パターン2・3と同じと判断できそうだ。
<=、>=、==を省いたら、7パターンまで減らせる。
さらにいえば、もし予約Aを取るとき、A終了=B開始が重複するのなら、A終了を-1 ミリ秒すれば被らない。なので A ( 14:00.00 ~14:59.99 )
と B( 15:00.00~15:29.99 )
としてしまえばいい。時間が被ってないとわかる。表示するときに、四捨五入でINTに丸めれば A(14:00 ~15:00)
とB(15:00~15:30)
になるわけだ。
時間の重複があるかないか
時間の重複があるかないか、それだけを考えるのでれば、更に減せる。
時間が被り予約が取れないリソースを確保できないみたいな判断だけなら、パターン1・5を満たすものだけ考えればいい。
つまり単純に考えればA終了<B開始 または、B終了<A開始
を満たせばいいとわかる。
ここまで考えれば、プログラミングで実現するまでもなく、SQLの検索条件に出来る。専用ライブラリ導入を考えずに、WHERE句だけでもいける。なので、時間範囲(予定表)を全件を無駄に取得して全部の組み合わせを比較するなんて言う、富豪プロミラングを避けられる。
なぜこんな事を考えてたのか。
とある、予定表のシステムのが「ものすごく遅い」ので使い物にならないのでJavascriptのFetchリクエストをみていたら、予定表を全件と一致を個別判定にリクエスト行ってたんですよね。呆然でした。富豪プロミラングもいいけどモヤっとする。
試しに実装してみた。
条件さえ整理してしまえば、プログラミングで、7 種類を判定、時間の重なりがあるかの判定はサクッと作れるのではないかと思った。なのでサクッと作ってみた。
条件を整理して、ANDを使えばそれぞれを識別できそうだった。
ご意見お待ちしております。
この記事は私がエクセルとにらめっこしながら3時間程度考えた結果です。
時間の範囲比較は、もっとこう考えればいいよ。ここ間違えてるよ。とか、もっと知りたいです。教えて下さい!!