SQLServerで日付の重複をSQLで検索する

プログラミング SQL Server

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
タイトルとURLをコピーしました