it-swarm.com.ru

MySQL - месячный интервал DATE_ADD

Я столкнулся с проблемой с функцией 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, что он хорошо работает и использует правильное количество дней в течение месяца?

28
Billy McNuggets

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 .

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

56
Adrian Carneiro

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

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

BETWEEN ... AND

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

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

1
Jacob

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

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

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

0
yu_sha

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