2009-06-24 8 views
1

J'ai une table MySql appelé critiques qui stocke beaucoup de critiques de produits, accumulées sur de nombreuses années, chacune annotée avec un horodatage de la date.
Je voulais faire un graphique à barres en me montrant le nombre de revues que j'ai accumulées chaque jour de l'année, dans l'espoir de trouver les dates importantes pour mon système.MySql années bissextiles

J'ai utilisé cette requête

select dayofyear(date),count(*) from reviews group by dayofyear(date); 

Cependant, après avoir remarqué que c'est de retour 366 lignes au lieu de 365, je me suis rendu compte que je ne peux pas l'utiliser pour faire de ce tableau, car l'index de jour est obtenir compensée par 1 chaque année bissextile, ce qui fausse mes données. Par exemple, Noël montre le jour # 359 sur la plupart des années, mais le # 360 sur les années bissextiles.

Quelle est la manière la plus simple de résoudre ce problème?

Sur un Sidenote, est-il tout logiciel qui peut accepter une requête SQL et retourne les résultats directement un bar-chart (quand un graphique à barres est logique)

Répondre

3

Je ne l'ai pas testé, mais vous pouvez faire quelque chose comme ce qui suit:

SELECT 
     # check if the year is a leap year: 
     IF((YEAR(mydate) % 4 = 0 AND YEAR(mydate) % 100 != 0) OR YEAR(mydate) % 400 = 0, 
      # if so, check if the date is before or after february 29th. if that is the case, we subtract one from the value 
      IF(DAYOFYEAR(mydate) > DAYOFYEAR("2008-02-28"), DAYOFYEAR(mydate) - 1, DAYOFYEAR(mydate)), 
      # if the year isn't a leap year, just return the regular dayofyear() value 
      DAYOFYEAR(mydate)) 
    FROM mytbl 

Cette fusionnera les données pour les 28 et 29 pour les années bissextiles, mais donner les mêmes compensations pour les jours au cours des années bissextiles et des années non bissextiles pour tous les autres jours. Un comportement plus souhaitable pourrait être de simplement ignorer les données du 29 février, ce qui pourrait être accompli en utilisant des conditions supplémentaires. Vous pouvez également lui affecter un index spécial, tel que 400, qui ne sera pas compensé tous les autres jours.

Une meilleure façon peut-être de groupe par mois et le jour du mois:

select month(date) m, day(date) d, count(*) from reviews group by m, d; 

Cela évite le problème tous ensemble, mais peut-être plus compliqué pour vous de traiter dans votre logique d'application. Pourtant, je dirais que c'est une bien meilleure façon de le faire.

1

Les grouper par jour du mois et rincer et répéter pour chaque mois?

Questions connexes