ホームページ >データベース >mysql チュートリアル >MySQL 範囲内の欠落している日付をゼロ値で埋める方法は?

MySQL 範囲内の欠落している日付をゼロ値で埋める方法は?

Linda Hamilton
Linda Hamiltonオリジナル
2025-01-23 16:47:09602ブラウズ

How to Fill Missing Dates in a MySQL Range with Zero Values?

MySQL の日付範囲が欠損値を埋める

2 つの列 (日付とスコア) を持つテーブルがあり、欠落している日付を埋めて連続した値のシーケンスを取得したいとします。たとえば、テーブルに現在次のデータが含まれているとします:

<code>日期      分数
-----------------
2010-08-01  19
2010-08-02  21
2010-08-04  14
2010-08-07  10
2010-08-10  14</code>

次の結果を得るために、欠落している日付 (2010-08-03、2010-08-05、および 2010-08-06) を 0 で埋めたいとします:

<code>日期      分数
-----------------
2010-08-01  19
2010-08-02  21
2010-08-03  0
2010-08-04  14
2010-08-05  0
2010-08-06  0
2010-08-07  10
2010-08-10  14</code>

これを実現するには、次のクエリを使用できます:

<code class="language-sql">SELECT x.ts AS timestamp,
       COALESCE(y.score, 0) AS cnt
FROM (SELECT DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY) AS ts
        FROM numbers n
       WHERE DATE_ADD('2010-06-06', INTERVAL n.id -1 DAY) < '2010-08-11') x
LEFT JOIN your_table y ON DATE(x.ts) = DATE(y.date);</code>

クエリの内訳は次のとおりです:

  • 値が自動インクリメントされる数値 (数字) のテーブルを作成します。
  • DATE_ADD を使用して、指定された開始日 (この例では「2010-06-06」) から日付のリストを作成し、数値テーブル内の数値の ID に基づいて日数を増分します。
  • LEFT JOIN を使用して、日付部分に基づいて日付のリストを元のテーブル y とマージします。
  • COALESCE を使用して、y.score 内の null 値を 0 に置き換えます。
  • 必要に応じて、DATE_FORMAT を使用して日付形式を変更できます。

your_table を実際のテーブル名に置き換えてください。 1 から始まる連続した整数を含む numbers という名前の自動インクリメント列を含む id という名前のテーブルがあることを確認してください。 そうでない場合は、最初に作成する必要があります。 例: CREATE TABLE numbers (id INT AUTO_INCREMENT PRIMARY KEY); 次に、日付範囲をカバーするのに十分な数のレコードを挿入します。

以上がMySQL 範囲内の欠落している日付をゼロ値で埋める方法は?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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