(私の意見では)簡単に最も効果的な方法は、あなたが言うように、すべての日付の表から始めることです。あなたはそれを自分で作成する必要があります、そしてあなたが作成したと仮定すると、ここにあなたのためのいくつかのオプションがあります...
SELECT
*
FROM
calendar -- Your manually created table of dates
LEFT JOIN
yourTable
ON yourTable.DateField = calendar.DateField
WHERE
yourTable.DateField IS NULL
AND calendar.DateField >= @reportFirstDate
AND calendar.DateField <= @reportLastdate
または...
SELECT
*
FROM
calendar -- Your manually created table of dates
WHERE
NOT EXISTS (SELECT * FROM yourTable WHERE yourTable.DateField = calendar.DateField)
AND calendar.DateField >= @reportFirstDate
AND calendar.DateField <= @reportLastdate
編集
この日付のリストを維持するのは「面倒」だと感じるかもしれませんが、このタイプのクエリにはパフォーマンス上の大きなメリットがあります。
日付テーブルを使用して、2つのインデックスを調べ、一方には存在するがもう一方には存在しないものを確認します。
日付テーブルがないと、はるかに複雑なアプローチになります...
1.テーブル内のすべてのレコードを取得します
2.テーブル内の次のレコードに自己結合します
3.連続した日付の場合は、それらを破棄します(ギャップのあるレコードを保持します)
4.ペアごとに、ループして欠落している日付を入力します5.
レポート期間の開始時に欠落している日付を処理します(ペアにDate1はありません)
6。レポート期間の終了時に欠落している日付を処理します(ペアにDate2はありません)
日付を使用して一時テーブルを作成する方が実際にはおそらく高速です。簡単な方法で作成してから、テーブルを再度削除してください。もしそうなら、なぜあなたは単に日付表を維持しないのですか?
- 100年のテーブルを持っているだけで、それを忘れてください
- すべてのコードで日付を最新に保つために、非常に簡単なコードを用意してください
確信が持てない場合は、さまざまなオプションを試して、インデックス付きの日付テーブルが他のオプションと比較してどれだけ高速であるかを自分で確認することをお勧めします。
(どれだけ短く、読みやすく、保守しやすいかは言うまでもありません)