ホームページ >データベース >mysql チュートリアル >SQLで自動日付補完を実装する方法

SQLで自動日付補完を実装する方法

(*-*)浩
(*-*)浩オリジナル
2019-05-11 12:01:289948ブラウズ

SQL で日付の自動補完を実装する方法: 最初に一定範囲のカレンダー テーブル データを生成し、次にこのカレンダー テーブル接続を通じて統計データ テーブルが必要なデータをクエリし、最後にこの範囲内の完全なデータを取得します。 、つまりキャンです。

SQLで自動日付補完を実装する方法

#最近、統計アクセス機能を開発する際、データテーブルから特定の日のデータが欠落していると、その日の記録が失われてしまいます。ただし、表示する必要はあります。その日のデータが利用できない場合は、デフォルトの 0 に設定できます。解決策は 2 つ考えられます:

1. データを読み取った後、不足しているデータをプログラムはループしていますが、これは統計データの可変範囲であり、要望に応じて7日分、30日分、60日分とカウントすることができ、プログラムでデータを完成させるのは少々面倒です。

2. まず、特定の範囲のカレンダー テーブル データを生成し、次にこのカレンダー テーブル接続を使用して統計データ テーブル内のデータをクエリします。そうでない場合、デフォルトは 0 です。このようにして、次の結果を取得できます。この範囲内の完全なデータであるため、このソリューションはこの需要の変化により適しています。

次の SQL ステートメントを使用してカレンダー テーブルを生成します:

CREATE TABLE num (i INT);-- 创建一个表用来储存0-9的数字
INSERT INTO num (i) VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);-- 生成0-9的数字,方便以后计算时间
CREATE TABLE  IF NOT EXISTS calendar(DATE DATE); -- 生成一个存储日期的表,date是字段名
-- 这里是生成并插入日期数据
INSERT INTO calendar(DATE) SELECT
    ADDDATE(
        (   -- 起始日期,从2017-1-1开始
            DATE_FORMAT("2017-1-1", '%Y-%m-%d')
        ),
        numlist.id
    ) AS `date`
FROM
    (
        SELECT
            n1.i + n10.i * 10 + n100.i * 100 + n1000.i * 1000 AS id
        FROM
            num n1
        CROSS JOIN num AS n10
        CROSS JOIN num AS n100
        CROSS JOIN num AS n1000
    ) AS numlist;

SQL を実行すると、1W レコードが生成されます。2017-01-01 ~ 2044-05-18 まで、これらのデータは; 対応する条件を変更することでさらに多くのデータを生成することもできますが、ここでは詳しく説明しませんので、必要に応じて変更してください。

次の SQL テストを実行します:

SELECT COUNT(u.id) AS num, c.date FROM calendar AS c
LEFT JOIN users AS u ON c.date = u.`created_at`
WHERE c.date BETWEEN '2017-05-01' AND '2017-05-07'
GROUP BY c.`date`
ORDER BY c.`date`

次の結果が得られます:

SQLで自動日付補完を実装する方法

以上がSQLで自動日付補完を実装する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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