ホームページ > データベース > mysql チュートリアル > SQL で、値がゼロの欠落した日付を含む完全な日付範囲を生成するにはどうすればよいですか?

SQL で、値がゼロの欠落した日付を含む完全な日付範囲を生成するにはどうすればよいですか?

Linda Hamilton
リリース: 2024-12-29 20:35:20
オリジナル
191 人が閲覧しました

How to Generate a Complete Date Range in SQL, Including Missing Dates with Zero Values?

欠損値を含む完全な日付範囲の生成

日付データを操作する場合、多くの場合、指定された範囲内のすべての日付を表示する必要があります。一部の日付の記録が欠落している場合でも。 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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート