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

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

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

How Can I Efficiently Fill Missing Dates in a MySQL Date Range?

MySQL: 日付範囲内の欠落した日付を効率的に処理する

このガイドでは、MySQL データベース内の日付シーケンスのギャップを埋めるための非常に効率的な方法を説明します。 中心的な手法では、NUMBERS テーブル (一連の整数を含む単純なテーブル) を利用して、欠落している日付を生成します。 この NUMBERS テーブルをデータ テーブルと結合すると、データ ポイントが存在しない場合でも完全な日付範囲を作成できます。 既存のスコアは保存されます。欠落しているスコアはデフォルト値 (例: 0) で表されます。

NUMBERS テーブルの作成と設定:

まず、NUMBERS テーブルを作成します (まだ存在しない場合)。

<code class="language-sql">CREATE TABLE IF NOT EXISTS numbers (id INT UNSIGNED AUTO_INCREMENT PRIMARY KEY);</code>

次に、十分な数の整数を入力します。 行数は、少なくとも日付範囲の最大日数と同じである必要があります。 簡単な (ただし、非常に広い範囲では時間がかかる可能性がある) 方法は次のとおりです。

<code class="language-sql">INSERT INTO numbers (id) VALUES (NULL); -- Repeat as needed to fill the desired range</code>

(注: 範囲が非常に大きい場合は、ストアド プロシージャや外部スクリプトを使用するなど、より効率的に NUMBERS テーブルにデータを設定する方法が存在します。)

完全な日付範囲を生成しています:

次のクエリは、NUMBERS テーブルを使用して一連の日付を生成し、対応するスコアを取得し、欠落している日付をデフォルトのスコア 0 で埋めます。

<code class="language-sql">SELECT 
    DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY) AS timestamp,
    COALESCE(t.score, 0) AS score  -- Replace 't.score' with your actual score column
FROM 
    numbers n
LEFT JOIN 
    your_table t ON DATE(t.date_column) = DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY) -- Replace 'your_table' and 'date_column'
WHERE 
    DATE_ADD('2010-06-06', INTERVAL n.id - 1 DAY) <= '2010-06-15'; -- Adjust start and end dates as needed</code>

your_tabledate_columnscore を実際のテーブル名と列名に置き換えてください。 DATE_ADD 関数で開始日と終了日を調整して、希望の範囲をカバーします。 COALESCE 関数は、欠落しているスコアを適切に処理します。 必要に応じて、DATE_FORMAT 関数を使用して日付の形式を調整できます。

このアプローチは、MySQL データ内の欠落した日付を管理するためのスケーラブルで効率的なソリューションを提供します。 非常に大きな日付範囲に対して NUMBERS テーブルの作成を最適化することを検討してください。

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

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