web-dev-qa-db-fra.com

comment puis-je obtenir le mois à partir de la date dans mysql

Je veux pouvoir récupérer les résultats de mysql avec une déclaration comme celle-ci:

SELECT * 
  FROM table 
 WHERE amount > 1000 

Mais je veux aller chercher le résultat contraint à un certain mois et année (basé sur l'entrée de l'utilisateur)… J'essayais comme ceci:

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

...$m étant un mois mais cela a donné une erreur. 

Dans ce tableau, il comporte en fait deux dates: startDate et endDate mais je me concentre sur startDate. Les valeurs d'entrée seraient mois et année. Comment énoncer l'instruction SQL qui obtient les résultats en fonction du mois de cette année? 

22
netrox

Vous étiez proche - obtenez la comparaison à l'envers (en supposant que startDate est un type de données DATETIME ou TIMESTAMP):

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

Mises en garde:


Alternatives:


Parce que l'utilisation de fonctions sur des colonnes ne peut pas utiliser d'index, une meilleure approche consisterait à utiliser BETWEEN et les fonctions STR_TO_DATE:

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

Voir la documentation pour la syntaxe de formatage.

Référence:


37
OMG Ponies

Utilisez la fonction month()

select month(now());
7
Gattster

Par exemple.

$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, ...

Cela créera une requête comme par exemple.

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

+ Interval 1 month est une alternative à date_add () .

SELECT Date('2010-01-01'+Interval 1 month)-> 2010-02-01
SELECT Date('2010-12-01'+Interval 1 month)-> 2011-01-01
Ainsi, vous obtenez toujours le premier jour du mois suivant. Les enregistrements que vous voulez doivent avoir un dateStart avant cette date, mais après/égal au premier jour du mois (et de l'année) que vous avez passé à sprintf ().
'2010-01-01'+Interval 1 month ne change pas entre les lignes. MySQL calculera le terme une seule fois et pourra utiliser des index pour la recherche.

3
VolkerK

Essaye ça:

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

Fonctionne dans: MySQL 5.7, MySQL 5.6, MySQL 5.5, MySQL 5.1, MySQL 5.0, MySQL 4.1, MySQL 4.0, MySQL 3.23

  • Journée:

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

    SELECT EXTRACT(MONTH FROM "2017-06-15");
    
  • Année:

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

Essayez ceci si (le champ de date est du texte puis convertissez cette chaîne en date):

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

Essaye ça 

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