Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

MySQL como preencher datas ausentes no intervalo?


O MySQL não tem funcionalidade recursiva, então você fica usando o truque da tabela NUMBERS -

  1. Crie uma tabela que contenha apenas números incrementais - fácil de fazer usando um 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. Preencha a tabela usando:
    INSERT INTO `example`.`numbers`
      ( `id` )
    VALUES
      ( NULL )
    

    ...para quantos valores você precisar.

  3. Use DATE_ADD para construir uma lista de datas, aumentando os dias com base no valor NUMBERS.id. Substitua "2010-06-06" e "2010-06-14" por suas respectivas datas de início e término (mas use o mesmo formato, AAAA-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. LEFT JOIN em sua tabela de dados com base na parte do tempo:
       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`
    

Se você quiser manter o formato de data, use o função DATE_FORMAT :
DATE_FORMAT(`x`.`ts`, '%d.%m.%Y') AS `timestamp`