Remplir les dates manquantes lors de la récupération de données entre deux dates dans MySQL
Dans MySQL, lors de la sélection de données entre deux dates à l'aide de l'opérateur BETWEEN, c'est Il est possible que certaines dates comprises dans la plage spécifiée n'aient aucune donnée correspondante. Cela peut entraîner des lignes vides ou manquantes dans les résultats de la requête.
Énoncé du problème :
Considérez une table nommée « tbl » avec des données associées à des dates, comme indiqué ci-dessous. :
Date | Data |
---|---|
2009-06-25 | 75 |
2009-07-01 | 100 |
2009-07-02 | 120 |
Si nous voulons récupérer toutes les données entre le '2009-06-25' et '2009-07-01' à l'aide de la requête suivante :
SELECT data FROM tbl WHERE date BETWEEN '2009-06-25' AND '2009-07-01';
La requête ne renverrait que les lignes contenant des données existantes dans la plage spécifiée. Cela signifie que les dates sans aucune donnée, telles que « 2009-06-26 », « 2009-06-27 » et « 2009-06-28 », seraient omises des résultats.
Solution : Tableaux de calendrier pour renseigner les dates manquantes
Pour résoudre ce problème et inclure toutes les dates dans les délais spécifiés plage, qu'il existe ou non des données les concernant, nous pouvons utiliser un concept connu sous le nom de « tableaux de calendrier ». Ces tables permettent de générer une séquence de dates dans un intervalle donné, servant essentiellement de « pseudo » table de toutes les dates possibles.
Voici un exemple de création d'une table de calendrier dans MySQL :
-- Create a table with integers from 0 to 9 CREATE TABLE ints (i INTEGER); INSERT INTO ints VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9); -- Generate a sequence of dates from '2009-06-25' to '2009-07-01' SELECT '2009-06-25' + INTERVAL a.i * 10 + b.i DAY AS date FROM ints a JOIN ints b WHERE date BETWEEN '2009-06-25' AND '2009-07-01';
Une fois que vous avez créé la table du calendrier, vous pouvez effectuer une jointure gauche avec votre table de données pour renseigner les dates manquantes. Voici la requête mise à jour :
SELECT cal.date, tbl.data FROM ( SELECT '2009-06-25' + INTERVAL a.i * 10 + b.i DAY AS date FROM ints a JOIN ints b WHERE date BETWEEN '2009-06-25' AND '2009-07-01' ) cal LEFT JOIN tbl ON cal.date = tbl.date WHERE cal.date BETWEEN '2009-06-25' AND '2009-07-01';
Cette requête récupère toutes les dates comprises dans la plage spécifiée, y compris celles sans aucune donnée dans la table "tbl". Les dates avec des données manquantes auront une valeur NULL dans la colonne "données".
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!