it-swarm.com.de

MySQL - DATE_ADD Monatsintervall

Ich habe ein Problem mit der Funktion DATE_ADD in MySQL.

Meine Anfrage sieht so aus:

SELECT * 
FROM mydb 
WHERE creationdate BETWEEN "2011-01-01" AND DATE_ADD("2011-01-01", INTERVAL 6 MONTH) 
GROUP BY MONTH(creationdate)

Das Problem ist, dass in den Ergebnissen, ich denke, weil June nur 30 Tage hat, die Funktion nicht richtig funktioniert, da ich die Ergebnisse des ersten von July habe.

Gibt es eine Möglichkeit, DATE_ADD mitzuteilen, dass es gut funktioniert und die richtige Anzahl von Tagen innerhalb eines Monats berücksichtigt?

28
Billy McNuggets

DATE_ADD funktioniert gut mit verschiedenen Monaten. Das Problem ist, dass Sie sechs Monate zu 2001-01-01 hinzufügen und der 1. Juli dort sein soll. 

Das möchten Sie tun:

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)

Weitere Informationen finden Sie in der DATE_ADD-Dokumentation .

* bearbeitet, um die Syntax zu korrigieren

56
Adrian Carneiro

Für mich ist das das erwartete Ergebnis. Hinzufügen von sechs Monaten zum 1. Januar. 

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

Wenn expr größer oder gleich min ist und expr kleiner oder gleich max ist, gibt BETWEEN 1 zurück, andernfalls 0. 

Der wichtige Teil hier ist EQUAL bis max., Was der 1. Juli ist.

1
Jacob

DATE_ADD funktioniert korrekt. Der 1. Januar plus 6 Monate ist der 1. Juli, genau wie der 1. Januar plus 1 Monat der 1. Februar.

Zwischenbetrieb ist inklusive. Sie bringen also bis zum 1. Juli alles mit. (Siehe auch MySQL "between" -Klausel nicht inklusive? )

Was Sie tun müssen, ist 1 Tag abzuziehen oder den Operator <anstelle von between zu verwenden.

0
yu_sha

Verstehe ich richtig, dass Sie davon ausgehen, dass DATE_ADD("2011-01-01", INTERVAL 6 MONTH) Ihnen '2011-06-30' anstelle von '2011-07-01' geben sollte? Natürlich ist 2011-01-01 + 6 Monate 2011-07-01. Sie wollen etwas wie DATE_SUB(DATE_ADD("2011-01-01", INTERVAL 6 MONTH), INTERVAL 1 DAY).

0
sw0x2A