2009-05-21 5 views
4

J'ai une table qui contient une liste d'événements de la communauté avec des colonnes pour les jours où l'événement commence et se termine. Si la date de fin est 0, l'événement se produit uniquement le jour du début. J'ai une requête qui renvoie le nombre d'événements qui se produisent un jour donné:MySQL pour obtenir le nombre de lignes qui tombent sur une date pour chaque jour d'un mois

SELECT COUNT(*) FROM p_community e WHERE 
    (TO_DAYS(e.date_ends)=0 AND DATE(e.date_starts)=DATE('2009-05-13')) OR 
    (DATE('2009-05-13')>=DATE(e.date_starts) AND DATE('2009-05-13')<=DATE(e.date_ends)) 

Je viens sous à une date que je veux tester « 2009-05-13 ».

Je dois être en mesure d'extraire ces données pour chaque jour d'un mois complet. Je pourrais juste courir la question contre chaque jour un à la fois, mais je préfère courir une question qui peut me donner le mois entier immédiatement. Quelqu'un at-il des suggestions sur la façon dont je pourrais faire cela?

Et non, je ne peux pas utiliser une procédure stockée.

Répondre

9

Essayez:

SELECT COUNT(*), DATE(date) FROM table WHERE DATE(dtCreatedAt) >= DATE('2009-03-01') AND DATE(dtCreatedAt) <= DATE('2009-03-10') GROUP BY DATE(date); 

Cela obtiendrait le montant pour chaque jour en mai 2009.

MISE À JOUR: fonctionne maintenant sur une plage de dates couvrant mois/années.

+0

J'ajouterais une quelques colonnes à la sélection, mais oui cela devrait le faire. –

+0

C'est tout ce qu'il a mis dans l'exemple donc je suis allé avec ça. – Greg

+0

Cela fonctionnerait si chaque événement était une date unique, mais j'ai affaire à une plage de dates pour chaque élément. Chaque événement s'étend de date_starts à date_ends, donc si un événement est du 10 au 14 mai, je dois être en mesure de reconnaître le 12 mai. – ChiperSoft

6

Malheureusement, MySQL n'a pas la possibilité de générer un ensemble de lignes d'un nombre donné de lignes.

Vous pouvez créer une table d'assistance:

CREATE TABLE t_day (day INT NOT NULL PRIMARY KEY) 

INSERT 
INTO t_day (day) 
VALUES (1), 
     (2), 
     …, 
     (31) 

et de l'utiliser dans un JOIN:

SELECT day, COUNT(*) 
FROM t_day 
JOIN p_community e 
ON  day BETWEEN DATE(e.start) AND IF(DATE(e.end), DATE(e.end), DATE(e.start)) 
GROUP BY 
     day 

Ou vous pouvez utiliser une sous-requête laid:

SELECT day, COUNT(*) 
FROM (
     SELECT 1 AS day 
     UNION ALL 
     SELECT 2 AS day 
     … 
     UNION ALL 
     SELECT 31 AS day 
     ) t_day 
JOIN p_community e 
ON  day BETWEEN DATE(e.start) AND IF(DATE(e.end), DATE(e.end), DATE(e.start)) 
GROUP BY 
     day 
+0

Merci, c'est à peu près ce que je m'attendais à faire. Je ne connaissais pas le mot clé BETWEEN tho, c'est beaucoup plus beau que ce que j'ai trouvé. – ChiperSoft

Questions connexes