MySQL - DATE_ADD月间隔

时间:2011-07-27 13:56:49

标签: mysql sql select dateadd

我在MySQL中遇到了函数DATE_ADD的问题。

我的请求如下:

SELECT * 
FROM mydb 
WHERE creationdate BETWEEN "2011-01-01" AND DATE_ADD("2011-01-01", INTERVAL 6 MONTH) 
GROUP BY MONTH(creationdate)

问题是,在结果中, - 我认为 - 因为 June 只有30天,因为我有 July的第一个结果,所以该功能无法正常工作

有没有办法让DATE_ADD运作良好并在一个月内采取正确的天数?

5 个答案:

答案 0 :(得分:56)

DATE_ADD在不同月份工作得很好。问题是你要在2001-01-01增加六个月,而7月1日应该在那里。

这是你想要做的:

SELECT * 
FROM mydb 
WHERE creationdate BETWEEN "2011-01-01" 
                   AND DATE_ADD("2011-01-01", INTERVAL 6 MONTH) - INTERVAL 1 DAY
GROUP BY MONTH(creationdate)

OR

SELECT * 
FROM mydb 
WHERE creationdate >= "2011-01-01" 
AND creationdate < DATE_ADD("2011-01-01", INTERVAL 6 MONTH)
GROUP BY MONTH(creationdate)

要进一步学习,请查看DATE_ADD documentation

*已编辑以更正语法

答案 1 :(得分:2)

嗯,对我来说这是预期的结果;将增加六个月至7月1日。

mysql> SELECT DATE_ADD( '2011-01-01', INTERVAL 6 month );
+--------------------------------------------+
| DATE_ADD( '2011-01-01', INTERVAL 6 month ) |
+--------------------------------------------+
| 2011-07-01                                 | 
+--------------------------------------------+

答案 2 :(得分:1)

BETWEEN ... AND

  

如果expr大于或等于min且expr小于或等于max,则BETWEEN返回1,否则返回0.

这里重要的部分是EQUAL to max。,7月1日是。

答案 3 :(得分:0)

DATE_ADD正常工作。 1月1日加6个月是7月1日,就像1月1日加1个月是2月1日。

在操作之间是包容性的。所以,你正在完成所有工作,包括7月1日。 (另见MySQL "between" clause not inclusive?

您需要做的是减去1天或使用&lt;运算符而不是之间。

答案 4 :(得分:0)

我是否理解你认为DATE_ADD("2011-01-01", INTERVAL 6 MONTH)应该给你'2011-06-30'而不是'2011-07-01'?当然,2011-01-01 + 6个月是2011-07-01。你想要DATE_SUB(DATE_ADD("2011-01-01", INTERVAL 6 MONTH), INTERVAL 1 DAY)

之类的东西