ホームページ >データベース >mysql チュートリアル >欠落している日付のゼロ値を含む、2 つの日付間のすべての日付を表示するにはどうすればよいですか?

欠落している日付のゼロ値を含む、2 つの日付間のすべての日付を表示するにはどうすればよいですか?

Linda Hamilton
Linda Hamiltonオリジナル
2024-12-23 02:08:10833ブラウズ

How to Show All Dates Between Two Dates, Including Zero Values for Missing Dates?

ゼロ値を含む 2 つの日付間のすべての日付データを表示する

日付データを操作する場合、すべての日付が表示されないシナリオがよく発生します。はデータセット内で表現されます。これにより、分析にギャップが生じる可能性があります。この問題に対処し、指定された範囲内のすべての日付を表示するには、さまざまな手法を組み合わせて使用​​できます。

次の問題を考えてみましょう。

次の構造を持つ @temp という名前のテーブルがあります。 :

DECLARE @temp TABLE (
    ID INT IDENTITY(1,1) NOT NULL,
    CDate SMALLDATETIME,
    Val INT
)

テーブルは 2012 年 10 月 2 日から 10 月 15 日までのデータを示します。 2012。ただし、2012 年 10 月 1 日から 2012 年 10 月 15 日までのすべての日付を取得し、欠落している日付についてはゼロの値を表示したいと考えています。

これを処理する 1 つのアプローチは、再帰的共通テーブル式 (CTE) を使用することです。 ) カレンダー テーブルを使用して、指定された範囲内のすべての日付を生成します。 CTE は次のように定義されます。

;WITH d(date) AS (
    SELECT CAST('10/01/2012' AS DATETIME),
    UNION ALL
    SELECT date + 1
    FROM d
    WHERE date < '10/15/2012'
)

この CTE は、2012 年 10 月 1 日から 2012 年 10 月 15 日までのすべての日付を生成します。

次に、CTE を @temp テーブルと結合して、次のように、ISNULL NULL 処理関数を使用して欠落した日付を処理し、各日付に対応する値を取得します。 query:

SELECT t.ID, d.date AS 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)

OPTION (MAXRECURSION 0) は、CTE での再帰の数を制限するために使用され、クエリが無期限に実行されないようにします。これを 0 に設定すると、無制限の再帰が可能になります。

このクエリは、2012 年 10 月 1 日から 2012 年 10 月 15 日までのすべての日付を表示し、欠落している日付には 0 の値を表示して、目的の結果を生成します。

以上が欠落している日付のゼロ値を含む、2 つの日付間のすべての日付を表示するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。