709 votes

Requête MySQL GROUP BY jour / mois / année

Est-il possible de faire une simple requête pour compter le nombre d'enregistrements que j'ai dans une période de temps déterminée comme une année, un mois ou un jour, en ayant une TIMESTAMP champ, comme :

SELECT COUNT(id)
FROM stats
WHERE record_date.YEAR = 2009
GROUP BY record_date.YEAR

Ou même :

SELECT COUNT(id)
FROM stats
GROUP BY record_date.YEAR, record_date.MONTH

Pour avoir une statistique mensuelle.

Merci !

2 votes

Je suppose que c'est censé être GROUP BY record_date.MONTH dans votre premier extrait de code ?

1092voto

codelogic Points 22722
GROUP BY YEAR(record_date), MONTH(record_date)

Consultez le fonctions date et heure dans MySQL.

31 votes

Vous pouvez ajouter une colonne supplémentaire pour plus de clarté dans certains cas, par exemple lorsque les enregistrements couvrent plusieurs années. SELECT COUNT(event_id), DATE_FORMAT(event_start, '%Y/%m')

1 votes

Un exemple simple et complet : SELECT count(*), record_date FROM anytable WHERE anytable.anycolumn = 'anycondition' GROUP BY YEAR(record_date), month(record_date); note : record_date est une date de type TIMESTAMP

0 votes

Il est probablement utile de mentionner que cela n'a pas fonctionné sur mon MySQL 5.7 avec une colonne aliasée COUNT (pas d'erreur, j'ai obtenu zéro résultat). Lorsque j'ai changé pour sélectionner ces champs avec alias, j'ai pu ensuite grouper par l'alias. Il s'agit d'une image docker MySQL 5.7 standard exécutée dans un environnement local, je n'ai donc aucune idée de la raison pour laquelle il n'y a pas eu d'erreur ou de résultats.

251voto

Andriy M Points 40395
GROUP BY DATE_FORMAT(record_date, '%Y%m')

Note (principalement, à l'intention des personnes susceptibles d'être descendues). Actuellement, cela n'est peut-être pas aussi efficace que d'autres suggestions. Néanmoins, je la laisse comme une alternative, et une, aussi, qui peut servir à voir comment les autres solutions sont plus rapides. (De plus, au fil du temps, des changements pourraient être apportés au moteur de MySQL en ce qui concerne l'optimisation, de sorte que cette solution, à un moment donné (peut-être pas si lointain) dans le futur, devienne tout à fait comparable en efficacité à la plupart des autres.

3 votes

J'ai l'impression que cela ne fonctionnerait pas bien car une fonction de formatage ne pourrait pas utiliser un index sur la colonne de la date.

0 votes

@Stv : Vous pourriez envisager La réponse de @fu-chi alors. Pour autant que je puisse dire, les expressions de regroupement dans cette réponse et la mienne évaluent la même chose, mais EXTRACT() peut être plus efficace que DATE_FORMAT() . (Je n'ai pas de MySQL pour faire des tests appropriés, cependant).

0 votes

J'aime regrouper les données en fonction de la date et de l'heure, de l'année, du mois, etc. Mais j'aime utiliser le format date_format dans la sélection pour reconstituer la date pour les groupes. date_format(concat(year(timestamp), "-", month(timestamp), "-", day(timestamp), " ", hour(timestamp), ":00"), '%Y-%m-%d')

53voto

fu-chi Points 151

Essayez celui-ci

SELECT COUNT(id)
FROM stats
GROUP BY EXTRACT(YEAR_MONTH FROM record_date)

EXTRACT(unité de la date) est meilleure car elle utilise moins de groupements et renvoie une valeur numérique.

Condition de comparaison lorsque le regroupement sera plus rapide que la fonction DATE_FORMAT (qui renvoie une valeur de chaîne). Essayez d'utiliser les fonctions|field qui renvoient une valeur autre qu'une chaîne de caractères pour les conditions de comparaison SQL (WHERE, HAVING, ORDER BY, GROUP BY).

44voto

dimazaid Points 678

J'ai essayé d'utiliser l'instruction "WHERE" ci-dessus, je pensais que c'était correct puisque personne ne l'avait corrigé mais j'avais tort ; après quelques recherches, j'ai découvert que c'est la bonne formule pour l'instruction "WHERE" et le code devient donc le suivant :

SELECT COUNT(id)  
FROM stats  
WHERE YEAR(record_date) = 2009  
GROUP BY MONTH(record_date)

17voto

Haijerome Points 831

Si vous voulez grouper par date dans MySQL, utilisez le code ci-dessous :

 SELECT COUNT(id)
 FROM stats
 GROUP BY DAYOFMONTH(record_date)

J'espère que cela fera gagner du temps à ceux qui trouveront ce fil.

6 votes

Il est important de noter que vous devez également regrouper par MONTH(record_date) également pour tenir compte des mois multiples.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X