Je rencontre un problème avec la fonction DATE_ADD
dans MySQL.
Ma demande ressemble à ceci:
SELECT *
FROM mydb
WHERE creationdate BETWEEN "2011-01-01" AND DATE_ADD("2011-01-01", INTERVAL 6 MONTH)
GROUP BY MONTH(creationdate)
Le problème est que, dans les résultats, -Je pense- parce que June n’a que 30 jours, la fonction ne fonctionne pas correctement car j’ai les résultats du premier de juillet .
Existe-t-il un moyen de dire à DATE_ADD
de bien travailler et de prendre le bon nombre de jours dans un mois?
DATE_ADD
fonctionne très bien avec des mois différents. Le problème est que vous ajoutez six mois à 2001-01-01
et que le 1er juillet est censé être là.
Voici ce que vous voulez faire:
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)
Pour un complément d’apprentissage, consultez DATE_ADD documentation .
* édité pour corriger la syntaxe
Eh bien, pour moi, c'est le résultat attendu. en ajoutant six mois au 1er janvier.
mysql> SELECT DATE_ADD( '2011-01-01', INTERVAL 6 month );
+--------------------------------------------+
| DATE_ADD( '2011-01-01', INTERVAL 6 month ) |
+--------------------------------------------+
| 2011-07-01 |
+--------------------------------------------+
Si expr est supérieur ou égal à min et expr est inférieur ou égal à max,
BETWEEN
renvoie 1, sinon il renvoie 0.
La partie importante ici est EQUAL à max., Ce qui est le 1er juillet.
DATE_ADD
fonctionne correctement. Le 1 er janvier plus 6 mois est le 1 er juillet, tout comme le 1 er janvier plus 1 mois est le 1 février.
Entre opération est inclusif. Donc, vous obtenez tout jusqu'au 1er juillet. (voir aussi MySQL "between" clause non inclusive? )
Ce que vous devez faire est soustraire 1 jour ou utiliser <opérateur au lieu d’entre.
Si j'ai bien compris, vous supposez que DATE_ADD("2011-01-01", INTERVAL 6 MONTH)
devrait vous donner '2011-06-30' au lieu de '2011-07-01'? Bien sûr, 2011-01-01 + 6 mois est le 2011-07-01. Vous voulez quelque chose comme DATE_SUB(DATE_ADD("2011-01-01", INTERVAL 6 MONTH), INTERVAL 1 DAY)
.