MySQL - месячный интервал DATE_ADD - PullRequest
28 голосов
/ 27 июля 2011

Я столкнулся с проблемой с функцией 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 ]

56 голосов
/ 27 июля 2011

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)

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 .

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

2 голосов
/ 27 июля 2011

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

mysql> SELECT DATE_ADD( '2011-01-01', INTERVAL 6 month );
+--------------------------------------------+
| DATE_ADD( '2011-01-01', INTERVAL 6 month ) |
+--------------------------------------------+
| 2011-07-01                                 | 
+--------------------------------------------+
1 голос
/ 27 июля 2011

BETWEEN ... AND

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

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

0 голосов
/ 27 июля 2011

Правильно ли я понимаю, что вы предполагаете, что 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).

0 голосов
/ 27 июля 2011

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

Между операциями включительно. Итак, вы получаете все до 1 июля. (см. также Предложение MySQL «между» не включено? )

Что вам нужно сделать, это вычесть 1 день или использовать <оператор вместо того, чтобы между ними. </p>

...