SQLを使って、開始日付、終了日付を持っているレコードの期間の重複を検索して見ます。
SQLを使って期間の重複を見つけ出す
SQLを使って、開始日付、終了日付を持っているレコードの期間の重複を検索して見ます。
テーブルの準備
まずは以下のようなレコードに有効期限を管理する開始日付、終了日付を持ったテーブルを作成します。
CREATE TABLE test_mast(
data_cd int NULL,
from_date date NULL,
to_date date NULL,
data_name varchar(100) NULL
)
レコード作成
次に以下のように開始日付と終了日付が重複したレコードを作成します。
| data_cd | from_date | to_date | data_name |
|---|---|---|---|
| 1 | 2013-01-01 | 2013-12-31 | DATA_CD=1基準レコード |
| 2 | 2012-12-01 | 2013-11-30 | DATA_CD=2、TOが重複 |
| 2 | 2013-01-01 | 2013-12-31 | DATA_CD=2基準レコード |
| 3 | 2013-01-01 | 2013-12-31 | DATA_CD=3基準レコード |
| 3 | 2013-02-01 | 2014-01-31 | DATA_CD=3、FROMが重複 |
| 4 | 2013-01-01 | 2013-12-31 | DATA_CD=4基準レコード |
| 4 | 2013-02-01 | 2013-11-30 | DATA_CD=4、FROM,TOが重複 |
| 5 | 2012-01-01 | 2012-12-31 | DATA_CD=5FROM,TOがともに過去 |
| 5 | 2013-01-01 | 2013-12-31 | DATA_CD=5基準レコード |
| 6 | 2013-01-01 | 2013-12-31 | DATA_CD=6基準レコード |
| 6 | 2014-01-01 | 2014-12-31 | DATA_CD=5FROM,TOがともに未来 |
日付の重複をSQLで検索
実際に開始日付、終了日付の期間が重複しているレコードを検索してみます。
SELECT
D1.data_cd
,D1.data_name
,D1.from_date
,D1.to_date
FROM
test_mast as D1
,test_mast as D2
WHERE
D1.data_cd = D2.data_cd
AND(
( D1.from_date > D2.from_date AND D1.to_date < D2.to_date )
OR ( D1.to_date > D2.from_date AND D1.from_date < D2.to_date ))
AND ( D1.from_date != D2.from_date OR D1.to_date != D2.to_date )
ORDER BY
D1.data_cd
,D1.from_date
,D1.to_date
[/sql]
以下が実行した結果です。
| data_cd | data_name | from_date | to_date |
|---|---|---|---|
| 2 | DATA_CD=2、TOが重複 | 2012-12-01 | 2013-11-30 |
| 2 | DATA_CD=2基準レコード | 2013-01-01 | 2013-12-31 |
| 3 | DATA_CD=3基準レコード | 2013-01-01 | 2013-12-31 |
| 3 | DATA_CD=3、FROMが重複 | 2013-02-01 | 2014-01-31 |
| 4 | DATA_CD=4基準レコード | 2013-01-01 | 2013-12-31 |
| 4 | DATA_CD=4、FROM,TOが重複 | 2013-02-01 | 2013-11-30 |
