web-dev-qa-db-fra.com

MySQL - Intervalle de mois DATE_ADD

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?

28
Billy McNuggets

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

56
Adrian Carneiro

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                                 | 
+--------------------------------------------+
2
wonk0

BETWEEN ... AND

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.

1
Jacob

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.

0
yu_sha

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).

0
sw0x2A