ホームページ >データベース >mysql チュートリアル >MySQL の日付範囲で欠落している日付を埋めるにはどうすればよいですか?

MySQL の日付範囲で欠落している日付を埋めるにはどうすればよいですか?

Mary-Kate Olsen
Mary-Kate Olsenオリジナル
2025-01-23 16:56:09736ブラウズ

How to Fill Missing Dates in MySQL Date Ranges?

MySQL の日付範囲で欠落している日付を入力します

MySQL では、欠落している日付を処理するには、必要な日付を決定し、ギャップを適切な値で埋める必要があります。幸いなことに、解決策はあります。それは、日付の昇順リストを生成する NUMBERS テーブルのトリックを利用することです。

まず、自動インクリメントされる ID 列を含む NUMBERS テーブルを作成します。

<code class="language-sql">CREATE TABLE numbers (
  id int(10) unsigned NOT NULL auto_increment,
   PRIMARY KEY  (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;</code>

INSERT ステートメントを使用して、テーブルに必要な数の値を入力します。

次に、DATE_ADD を使用して ID 値に基づいて日付リストを生成します。

<code class="language-sql">SELECT DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY)
FROM `numbers` `n`
WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` -1 DAY) <= '2010-06-14'</code>

「2010-06-06」と「2010-06-14」をそれぞれ独自の開始日と終了日に置き換えます。

最後に、時間部分とデータテーブルに基づいて LEFT JOIN を実行します。

<code class="language-sql">SELECT `x`.`ts` AS `timestamp`,
          COALESCE(`y`.`score`, 0) AS `cnt`
     FROM (SELECT DATE_FORMAT(DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY), '%Y-%m-%d') AS `ts`
             FROM `numbers` `n`
            WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) <= '2010-06-14') x
LEFT JOIN `y` ON STR_TO_DATE(`y`.`date`, '%d.%m.%Y') = STR_TO_DATE(`x`.`ts`, '%Y-%m-%d')</code>

このクエリでは、欠落している日付は 0 で埋められます。元の日付形式を維持するには、DATE_FORMAT(x.ts, '%d.%m.%Y') AS timestamp を使用します。 ここでは、日付形式の一貫性を確保し、変換に y 関数が使用されるようにするために、STR_TO_DATE テーブルが変更されていることに注意してください。 これは元の記事の方法よりも信頼性があります。

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

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