sql >> データベース >  >> RDS >> Mysql

MySQLは、範囲内の欠落している日付を埋める方法を教えてください。

    MySQLには再帰機能がないため、NUMBERSテーブルトリックを使用する必要があります-

    1. 増分数のみを保持するテーブルを作成します-auto_incrementを使用して簡単に実行できます:

      DROP TABLE IF EXISTS `example`.`numbers`;
      CREATE TABLE  `example`.`numbers` (
        `id` int(10) unsigned NOT NULL auto_increment,
         PRIMARY KEY  (`id`)
      ) ENGINE=InnoDB DEFAULT CHARSET=latin1;
      
    2. 次を使用してテーブルにデータを入力します:

      INSERT INTO `example`.`numbers`
        ( `id` )
      VALUES
        ( NULL )
      

      ...必要な数の値に対して。

    3. DATE_ADD> 日付のリストを作成し、NUMBERS.id値に基づいて日数を増やします。 「2010-06-06」と「2010-06-14」をそれぞれの開始日と終了日に置き換えます(ただし、同じ形式、YYYY-MM-DDを使用します)-

      SELECT `x`.*
        FROM (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' ) x
      
    4. 時間の部分に基づいてデータのテーブルに左に参加します:

         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), '%m/%d/%Y') AS `ts`
                   FROM `numbers` `n`
                  WHERE DATE_ADD('2010-06-06', INTERVAL `n`.`id` - 1 DAY) <= '2010-06-14') x
      LEFT JOIN TABLE `y` ON STR_TO_DATE(`y`.`date`, '%d.%m.%Y') = `x`.`ts`
      

    日付形式を維持する場合は、DATE_FORMAT関数

    DATE_FORMAT(`x`.`ts`, '%d.%m.%Y') AS `timestamp`
    


    1. Android sqlite、データベースの行数を制限する

    2. Oracleセッションの日付形式を確認する方法

    3. MySQL:別のフィールドに基づいてシーケンス列を追加します

    4. C#を使用して挿入された行のIDを取得します