SQLServerの再帰SQLで歯抜けの日付データを取得する

プログラミング SQL Server

処理が自動実行(バッチ処理)で実行された日付を管理しているテーブルから、処理が実行されなかった日(歯抜けの日付データ)を抜き出す必要があったのでSQLを作ってみました。

スポンサーリンク

再帰SQLを使って歯抜けの日付データを取得

処理が自動実行(バッチ処理)で実行された日付を管理しているテーブルから、処理が実行されなかった日(歯抜けの日付データ)を抜き出す必要があったのでSQLを作ってみました。

歯抜けの日付けデータを取得するSQL

WITH cal_info AS
(
SELECT
CAST( ‘2013/04/25’ AS DATE ) AS cal_date
UNION ALL
SELECT
DATEADD( day, 1, cal_date )
FROM
cal_info
WHERE
cal_info.cal_date < '2013/05/10' ) SELECT CONVERT ( VARCHAR(10), cal_date, 111 ) AS カレンダー日付 ,CONVERT ( VARCHAR(10), chk_tbl.chk_date, 111 ) AS チェック日付 FROM cal_info LEFT OUTER JOIN 日付抜けをチェックするテーブル AS chk_tbl ON cal_info.cal_date = chk_tbl.chk_date AND chk_tbl.chk_date BETWEEN '2013/04/25' AND '2013/05/10' [/sql] まずは長くなるSQLに「共通テーブル式」を使ってクエリに名前をつけます。

上記のSQLで行くとWITH cal_info ASがその部分にあたります。

その中に「再帰SQL」を使って指定された期間の日付データを作成します。

これで「cal_info」には2013/04/25から2013/05/10までの連続した日付のデータが選択されます。

最後に選択された日付データをチェックをしたいテーブルの日付でLEFT OUTER JOIN(左外部結合)をすれば「日付抜けをチェックするテーブル」で「cal_info」の日付が存在しない日がNULLで取得されます。

そのNULLになった日が「日付抜けをチェックするテーブル」に存在しない日付になります。

実行結果

カレンダー日付 チェック日付
2013/04/25 2013/04/25
2013/04/26 2013/04/26
2013/04/27 2013/04/27
2013/04/28 NULL
2013/04/29 NULL
2013/04/30 NULL
2013/05/01 2013/05/01
2013/05/02 2013/05/02
2013/05/03 2013/05/03
2013/05/04 NULL
2013/05/05 NULL
2013/05/06 NULL
2013/05/07 NULL
2013/05/08 NULL
2013/05/09 NULL
2013/05/10 NULL
タイトルとURLをコピーしました