DataBase MySQL SQLServer

SQLで時間の重複をチェックする

投稿日:

同じ期間のデータは事前にチェックしてエラーにするという処理は、
あらゆる場面で想定されそうなことですが、
以外と難しかったのでここに方法をのこしておきます。

他にも素晴らしい方法があると思いますが、
私が考えた結果、これにたどり着きました・・・

理屈を説明します。
開始時間A~終了時間A
開始時間B~終了時間B
があったとしまます。

この場合、以下の4つのチェックを行います。
①開始時間A~終了時間Aの間に、開始時間Bがあるかどうか
②開始時間A~終了時間Aの間に、終了時間Bがあるかどうか
③開始時間B~終了時間Bの間に、開始時間Aがあるかどうか
④開始時間B~終了時間Bの間に、終了時間Aがあるかどうか
いずれかの1つでもtrueになれば重複しています。

この法則を見つけるにあたり、私は下のような図を描いて眺めていました・・・
timecheck

皆さんしっていましたか?

もしもっと簡単な方法があれば教えていただけると嬉しいです

select
    count(*)
from
    table_name
where
    STARTB between STARTA and ENDA
 or ENDB   between STARTA and ENDA
 or STARTA between STARTB and ENDB
 or ENDA   between STARTB and ENDB

Gooleアドセンス用336

Gooleアドセンス用336

-DataBase, MySQL, SQLServer

執筆者:

関連記事

mysql

MySQLが起動できない

エラーログには下記ログが大量に出力されて起動できない・・・。 2013-08-22 17:32:10 30137 [ERROR] InnoDB: Unable to lock ./ibdata1, e …

sqlserver

テーブル変更やインデックス追加時にSELECTできるのか

INDEX1 テーブルの変更は運用に影響するのか?2 テーブルの変更3 インデックスの追加 テーブルの変更は運用に影響するのか? 運用中のテーブルを変更しないといけない場合は多々あります。 運用中のテ …

mysql

MySQLでフラグの列でSELECTする。(複合インデックスの使用条件)

status=’1’とかdelete=’0’といった条件はよく使用することでしょう。 そこでフラグにはどのデータ型がベストなのでしょうか。 INDEX1 …

mysql

MySQLのバイナリログを見てスレーブ停止の原因を調査する

以前スレーブ側の更新がとまっていることに気付きました :x001: その時のトラブルシューティングの手順です。 INDEX1 1.スレーブ側で、SlaveS tatusを確認する2 2.スレーブ側のロ …

mysql

MySQLのエラー、クエリ、スロークエリのログ

全て /etc/my.cnf の [mysqld] に追記してサーバーを再起動すれば出力されるようになります。 エラーログは開発時には警告も出力しておけばよいでしょう。 クエリログは全てのSELECT …