sql >> Database teknologi >  >> RDS >> Mysql

MySQL hvordan udfylder man manglende datoer inden for rækkevidde?

MySQL har ikke rekursiv funktionalitet, så du står tilbage med at bruge NUMBERS tabeltricket -

  1. Opret en tabel, der kun indeholder stigende tal - let at lave ved hjælp af et 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. Udfyld tabellen med:

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

    ...for så mange værdier, som du har brug for.

  3. Brug DATE_ADD for at konstruere en liste over datoer, øge dagene baseret på NUMBERS.id-værdien. Erstat "2010-06-06" og "2010-06-14" med dine respektive start- og slutdatoer (men brug samme format, ÅÅÅÅ-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 på din tabel med data baseret på tidsdelen:

       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`
    

Hvis du vil bevare datoformatet, skal du bruge DATE_FORMAT-funktion :

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


  1. Lagret procedure for at få oplysninger om databasetabeller

  2. Vælg kolonner med bestemte kolonnenavne i PostgreSQL

  3. Eksporter Oracle-forespørgselsresultater til en HTML-fil, når du bruger SQLcl

  4. Optimer MySQL/MariaDB-ydeevnen med MySQLTunner-værktøjet