我在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
运作良好并在一个月内采取正确的天数?
答案 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)
答案 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)
。