webentwicklung-frage-antwort-db.com.de

wie bekomme ich einen Monat in MySQL

Ich möchte in der Lage sein, Ergebnisse mit der folgenden Anweisung von MySQL abzurufen:

SELECT * 
  FROM table 
 WHERE amount > 1000 

Aber ich möchte das Ergebnis auf einen bestimmten Monat und ein bestimmtes Jahr (basierend auf den Eingaben des Benutzers) beschränken ... Ich habe es so versucht:

SELECT * 
  FROM table 
 WHERE amount > 1000 
   AND dateStart = MONTH('$m')   

...$m ist ein Monat, aber es wurde ein Fehler ausgegeben. 

In dieser Tabelle gibt es eigentlich zwei Daten: startDate und endDate, aber ich konzentriere mich auf startDate. Die Eingabewerte wären Monat und Jahr. Wie formuliere ich die SQL-Anweisung, die die Ergebnisse basierend auf diesem Monat dieses Jahres abruft? 

22
netrox

Sie waren nah dran - haben den Vergleich rückwärts gemacht (vorausgesetzt, startDate ist ein Datentyp DATETIME oder TIMESTAMP):

SELECT * 
  FROM table 
 WHERE amount > 1000 
   AND MONTH(dateStart) = {$m}

Vorsichtsmaßnahmen:


Alternativen:


Da bei der Verwendung von Funktionen für Spalten keine Indizes verwendet werden können, wäre es besser, BETWEEN und die STR_TO_DATE-Funktionen zu verwenden:

WHERE startdate BETWEEN STR_TO_DATE([start_date], [format]) 
                    AND STR_TO_DATE([end_date], [format])

Informationen zur Formatierungssyntax finden Sie in der Dokumentation.

Referenz:


37
OMG Ponies

Verwenden Sie die Funktion month()

select month(now());
7
Gattster

Z.B.

$date = sprintf("'%04d-%02d-01'", $year, $month);
$query = "
  SELECT
    x,y,dateStart
  FROM
    tablename
  WHERE
    AND amount > 1000
    AND dateStart >= $date
    AND dateStart < $date+Interval 1 month
";
mysql_query($query, ...

Dadurch wird eine Abfrage wie z.

WHERE
  AND amount > 1000
  AND dateStart >= '2010-01-01'
  AND dateStart < '2010-01-01'+Interval 1 month

+ Interval 1 month ist eine Alternative zu date_add () .

SELECT Date('2010-01-01'+Interval 1 month)-> 2010-02-01
SELECT Date('2010-12-01'+Interval 1 month)-> 2011-01-01
Auf diese Weise erhalten Sie immer den ersten Tag des folgenden Monats. Die gewünschten Datensätze müssen einen dateStart vor diesem Datum haben, aber nach/gleich dem ersten Tag des Monats (und Jahres), den Sie an sprintf () übergeben haben.
'2010-01-01'+Interval 1 month wechselt nicht zwischen den Zeilen. MySQL berechnet den Begriff nur einmal und kann Indizes für die Suche verwenden.

3
VolkerK

Versuche dies:

SELECT * 
FROM table 
WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m')
3
Louis

Funktioniert in: MySQL 5.7, MySQL 5.6, MySQL 5.5, MySQL 5.1, MySQL 5.0, MySQL 4.1, MySQL 4.0, MySQL 3.23

  • Tag:

    SELECT EXTRACT(DAY FROM "2017-06-15");
    
  • Monat:

    SELECT EXTRACT(MONTH FROM "2017-06-15");
    
  • Jahr:

    SELECT EXTRACT(YEAR FROM "2017-06-15");
    
0
Mr.DIpak SOnar

Versuchen Sie Folgendes, wenn (Datumsfeld ist Text, dann konvertieren Sie diese Zeichenfolge in Datum):

SELECT * FROM `table_name` WHERE MONTH(STR_TO_DATE(date,'%d/%m/%Y'))='11'

//This will give month number MONTH(STR_TO_DATE(date,'%d/%m/%Y'))
//If its return 11 then its November
// Change date format with your date string format  %d/%m/%Y
0
A.Aleem11

Versuche dies 

SELECT * 
      FROM table 
     WHERE amount > 1000 
       AND MONTH(datestart)
    GROUP BY EXTRACT(YEAR_MONTH FROM datestart)
0
Choxmi