処理が自動実行(バッチ処理)で実行された日付を管理しているテーブルから、処理が実行されなかった日(歯抜けの日付データ)を抜き出す必要があったので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 |