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 |
+--------------------------------------------+
Если 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)
.