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?
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}
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.
Utilisez la fonction month()
.
select month(now());
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.
Essaye ça:
SELECT *
FROM table
WHERE amount > 1000 AND MONTH(dateStart) = MONTH('$m') AND YEAR(dateStart) = YEAR('$m')
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");
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
Essaye ça
SELECT *
FROM table
WHERE amount > 1000
AND MONTH(datestart)
GROUP BY EXTRACT(YEAR_MONTH FROM datestart)