Подтвердить что ты не робот

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)

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

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

4b9b3361

Ответ 1

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.

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

Ответ 2

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

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

Ответ 3

BETWEEN ... AND

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

Важная часть здесь EQUAL до макс., которая 1 июля.

Ответ 4

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

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

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

Ответ 5

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