restar - mysql sumar minutos a datetime
MySQL-DATE_ADD intervalo de mes (5)
Tengo un problema con la función DATE_ADD
en MySQL.
Mi solicitud se ve así:
SELECT *
FROM mydb
WHERE creationdate BETWEEN "2011-01-01" AND DATE_ADD("2011-01-01", INTERVAL 6 MONTH)
GROUP BY MONTH(creationdate)
El problema es que, en los resultados, "creo", porque junio solo tiene 30 días, la función no funciona correctamente ya que tengo los resultados del primero de julio .
¿Hay alguna manera de decirle a DATE_ADD
que funcione bien y tome la cantidad correcta de días dentro de un mes?
¿Entiendo bien que usted supone que DATE_ADD("2011-01-01", INTERVAL 6 MONTH)
debería darle ''2011-06-30'' en lugar de ''2011-07-01''? Por supuesto, 2011-01-01 + 6 meses es 2011-07-01. Desea algo como DATE_SUB(DATE_ADD("2011-01-01", INTERVAL 6 MONTH), INTERVAL 1 DAY)
.
Bueno, para mí este es el resultado esperado; añadiendo seis meses hasta el 1 de enero.
mysql> SELECT DATE_ADD( ''2011-01-01'', INTERVAL 6 month );
+--------------------------------------------+
| DATE_ADD( ''2011-01-01'', INTERVAL 6 month ) |
+--------------------------------------------+
| 2011-07-01 |
+--------------------------------------------+
Si expr es mayor o igual a min y expr es menor o igual que max,
BETWEEN
devuelve 1; de lo contrario, devuelve 0.
La parte importante aquí es IGUAL a max., Que es el 1 de julio.
DATE_ADD
funciona bien con diferentes meses. El problema es que está agregando seis meses al 2001-01-01
y se supone que el 1 de julio está allí.
Esto es lo que quieres hacer:
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)
O
SELECT *
FROM mydb
WHERE creationdate >= "2011-01-01"
AND creationdate < DATE_ADD("2011-01-01", INTERVAL 6 MONTH)
GROUP BY MONTH(creationdate)
Para obtener más información, consulte la documentación de DATE_ADD .
* editado para corregir la sintaxis
DATE_ADD
funciona correctamente. El 1 de enero más 6 meses es el 1 de julio, al igual que el 1 de enero más 1 mes es el 1 de febrero.
Entre operación es inclusiva. Por lo tanto, está haciendo todo hasta, e incluyendo, el 1 de julio. (ver también la cláusula MySQL "between" no inclusive? )
Lo que debe hacer es restar 1 día o usar <operador en lugar de entre.