45

我正在构建一个图表,我想接收每个月的数据。

这是我第一个有效的请求:

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

但是,就我而言,我必须写 12 个请求来接收前 12 个月的数据,有什么技巧可以避免写:

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

我听说过 INTERVAL,我去了 MySQL 文档,但我没有设法实现它。

请问有使用INTERVAL的例子吗?

4

3 回答 3

77

你需要DATE_ADD/DATE_SUB

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

应该管用。

于 2010-05-08T10:04:20.423 回答
26

正如 A Star 所建议的那样,我总是使用以下内容:

DATE(NOW()) - INTERVAL 1 MONTH

同样你可以这样做:

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

等等。比打字DATE_ADDDATE_SUB一直打字容易得多:)!

于 2013-04-03T11:37:26.290 回答
16

我通常使用

DATE_ADD(CURDATE(), INTERVAL - 1 MONTH)

这与 Pekka 的几乎相同,但通过这种方式,您可以控制 INTERVAL 为负数或正数...

于 2010-05-08T10:09:35.450 回答