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
работать хорошо и принять правильное количество дней в течение месяца?
Ответы
Ответ 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)
.