MySQL-дата добавить месяц интервал

я сталкиваюсь с проблемой с помощью функции 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)

проблема в том, что в результатах, - думаю, - потому что есть только 30 дней, функция не работает должным образом, так как у меня есть результаты первого .

есть ли способ, чтобы сказать DATE_ADD чтобы хорошо работать и принимать правильное количество дней в течение месяца?

5 ответов


DATE_ADD отлично работает с разными месяцами. Проблема в том, что вы добавляете шесть месяцев до 2001-01-01 и 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 документации.

*отредактировано для исправления синтаксиса


Ну, для меня это ожидаемый результат; добавление шести месяцев к янв. 1 июля.

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

BETWEEN ... AND

Если expr больше или равно min и expr меньше или равно max,BETWEEN возвращает 1, иначе возвращает 0.

важная часть здесь равна max., который 1 июля.


DATE_ADD работает правильно. 1 января плюс 6 месяцев - 1 июля, так же как 1 января плюс 1 месяц-1 февраля.

между операциями включено. Таким образом, вы получаете все до, и в том числе, 1 июля. (см. также MySQL "между" предложение не включено?)

что вам нужно сделать, это вычесть 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).