web-dev-qa-db-fra.com

Mysql: sélectionne toutes les données entre deux dates

J'ai une table mysql avec des données connectées à des dates. Chaque ligne contient des données et une date, comme ceci:

2009-06-25    75
2009-07-01    100
2009-07-02    120

J'ai une requête mysql qui sélectionne toutes les données entre deux dates. C'est la requête:

SELECT data FROM tbl WHERE date BETWEEN date1 AND date2

Mon problème est que je dois également obtenir les lignes entre date1 et date2 même s'il n'y a pas de données pour un jour.

Donc, ma requête raterait les dates vides entre le 2009-06-25 et le 2009-07-01.

Puis-je en quelque sorte ajouter ces dates avec seulement 0 comme données?

44
Martymart

Vous pouvez utiliser un concept fréquemment appelé "tables de calendrier". Here est un bon guide sur la création de tables de calendrier dans MySql:

-- create some infrastructure
CREATE TABLE ints (i INTEGER);
INSERT INTO ints VALUES (0), (1), (2), (3), (4), (5), (6), (7), (8), (9);

-- only works for 100 days, add more ints joins for more
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
    ORDER BY a.i * 10 + b.i
) cal LEFT JOIN tbl ON cal.date = tbl.date
WHERE cal.date BETWEEN '2009-06-25' AND '2009-07-01';

Vous voudrez peut-être créer la table cal à la place de la sous-sélection.

38
Josef Pfleger
Select *  from  emp where joindate between date1 and date2;

Mais cette requête ne montre pas les données appropriées.

Par exemple

1-jan-2013 to 12-jan-2013.

Mais c'est montrer des données

1-jan-2013 to 11-jan-2013.
12
gulab

il est très facile de gérer cette situation

Vous pouvez utiliser ENTRE CLAUSE en combinaison avec date_sub (now (), INTERVAL 30 JOUR)) ET NOW ()

SELECT
    sc_cust_design.design_id as id,
    sc_cust_design.main_image,
    FROM
    sc_cust_design
WHERE
    sc_cust_design.publish = 1 
    AND **`datein`BETWEEN date_sub( now( ) , INTERVAL 30 DAY ) AND NOW( )**

Bonne codage :)

10
Arshad Munir

Avez-vous une table qui a toutes les dates? Sinon, vous voudrez peut-être envisager de mettre en place une table de calendrier et de joindre vos données à la table de calendrier.

4
feihtthief

SI VOUS POUVEZ L'ÉVITER .. NE LE FAITES PAS

Les bases de données ne sont pas vraiment conçues pour cela, vous essayez effectivement de créer des données (bien qu'une liste de dates) dans une requête.

Pour ceux qui ont une couche d'application au-dessus de la requête de base de données, la solution la plus simple consiste à y renseigner les données vierges.

De toute façon, vous ferez probablement une boucle dans les résultats de la requête et pourrez implémenter quelque chose comme ceci:

loop_date = start_date

while (loop_date <= end_date){

  if(loop_date in db_data) {
    output db_data for loop_date
  }
  else {
    output default_data for loop_date
  }

  loop_date = loop_date + 1 day
}

Les avantages en sont une transmission de données réduite; des requêtes plus simples et plus faciles à déboguer; et ne vous inquiétez pas de déborder de la table du calendrier.

1
Arth

vous devez ajouter 1 jour à la date de fin, en utilisant: DATE_ADD('$end_date', INTERVAL 1 DAY)

1
Dedi Koswara