web-dev-qa-db-fra.com

Travailler avec INTERVAL et CURDATE dans MySQL

Je crée un graphique et je souhaite recevoir des données pour chaque mois.

Voici ma première demande qui fonctionne:

SELECT s.GSP_nom AS nom, timestamp, AVG( v.vote +  v.prix  ) /2 AS avg
FROM votes_serveur AS v
INNER JOIN serveur AS s ON v.idServ = s.idServ
WHERE s.valide =1
AND v.date > CURDATE() -30
GROUP BY s.GSP_nom
ORDER BY avg DESC

Mais, dans mon cas, je dois écrire 12 demandes de réception de données pour les 12 mois précédents, y a-t-il une astuce pour éviter d'écrire:

//  example for the previous month
 AND v.date > CURDATE() -60
AND v.date < CURDATE () -30

J'ai entendu parler d'INTERVAL, je suis allé au document MySQL mais je n'ai pas réussi à l'implémenter.

Un exemple d'utilisation d'INTERVAL, s'il vous plaît?

38
sf_tristanb

Vous avez besoin DATE_ADD/DATE_SUB :

AND v.date > (DATE_SUB(CURDATE(), INTERVAL 2 MONTH))
AND v.date < (DATE_SUB(CURDATE(), INTERVAL 1 MONTH))

devrait marcher.

64
Pekka 웃

Comme suggéré par A Star, j'utilise toujours quelque chose comme:

DATE(NOW()) - INTERVAL 1 MONTH

De même, vous pouvez faire:

NOW() + INTERVAL 5 MINUTE
"2013-01-01 00:00:00" + INTERVAL 10 DAY

etc. Bien plus simple que de taper DATE_ADD ou DATE_SUB tout le temps :)!

21
seddy

J'utilise habituellement

DATE_ADD(CURDATE(), INTERVAL - 1 MONTH)

Ce qui est presque le même que celui de Pekka, mais de cette façon, vous pouvez contrôler votre INTERVALLE pour qu'il soit négatif ou positif ...

16
confiq