ホームページ >データベース >mysql チュートリアル >SQL で、値がゼロの欠落した日付を含む完全な日付範囲を生成するにはどうすればよいですか?
欠損値を含む完全な日付範囲の生成
日付データを操作する場合、多くの場合、指定された範囲内のすべての日付を表示する必要があります。一部の日付の記録が欠落している場合でも。 SQL でこれを実現し、欠落している日付が関連する列でゼロ値を表示するようにするにはどうすればよいですか?
サンプル日付データを含む次のテーブル @temp を考えてみましょう:
INSERT INTO @temp SELECT '10/2/2012', 1 INSERT INTO @temp SELECT '10/3/2012', 1 INSERT INTO @temp SELECT '10/5/2012', 1 INSERT INTO @temp SELECT '10/7/2012', 2 INSERT INTO @temp SELECT '10/9/2012', 2 INSERT INTO @temp SELECT '10/10/2012', 2 INSERT INTO @temp SELECT '10/13/2012', 2 INSERT INTO @temp SELECT '10/15/2012', 2
取得するには指定した 2 つの日付間のすべての日付を取得するには、次のクエリを使用できます:
SELECT * FROM @temp WHERE CDate BETWEEN '10/01/2012' AND '10/15/2012'
ただし、このクエリは、その日付範囲内の既存のレコードのみを返します。欠落している値がゼロの日付を含めるには、完全な日付範囲を作成し、既存のデータと結合する必要があります。
;WITH d(date) AS ( SELECT CAST('10/01/2012' AS DATETIME) UNION ALL SELECT DATE + 1 FROM d WHERE DATE < '10/15/2012' ) SELECT t.ID, d.date CDate, ISNULL(t.val, 0) AS val FROM d LEFT JOIN temp t ON t.CDate = d.date ORDER BY d.date OPTION (MAXRECURSION 0) -- Use this if your dates are >99 days apart
MAXRECURSION 数値オプションは再帰的反復の数を制限し、クエリが正常に完了することを保証します。 。 ISNULL 関数は、val 列の null 値をゼロに置き換えます。
このアプローチを使用すると、指定された範囲内のすべての日付が、欠損値がゼロで表されて表示されるようにできます。
以上がSQL で、値がゼロの欠落した日付を含む完全な日付範囲を生成するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。