34

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

我的请求如下所示:

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在一个月内好好工作并花上合适的天数?

4

5 回答 5

66

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)

或者

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

如需进一步学习,请查看DATE_ADD 文档

*编辑以纠正语法

于 2011-07-27T14:03:46.540 回答
6

好吧,对我来说,这是预期的结果;增加六个月到 1 月 1 日。

mysql> SELECT DATE_ADD( '2011-01-01', INTERVAL 6 month );
+--------------------------------------------+
| DATE_ADD( '2011-01-01', INTERVAL 6 month ) |
+--------------------------------------------+
| 2011-07-01                                 | 
+--------------------------------------------+
于 2011-07-27T14:03:04.163 回答
1

我是否理解正确,您认为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)

于 2011-07-27T14:06:28.777 回答
1

BETWEEN ... AND

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

这里的重要部分是等于最大值,即 7 月 1 日。

于 2011-07-27T14:02:19.520 回答
0

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

操作之间是包容性的。因此,您将在 7 月 1 日之前完成所有工作,包括 1 日。(另见MySQL “between” 子句不包含?

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

于 2011-07-27T14:04:33.220 回答