Bonjour,
j’essaie d’afficher une liste d’articles publiés dans le mois dernier. Comment écrire la requête ??
la requête "fausse" que j'ai écrite est la suivante :
Merci d'avance.Code:SELECT * FROM matable WHERE MONTH(created) = MONTH(NOW()) - 1
Version imprimable
Bonjour,
j’essaie d’afficher une liste d’articles publiés dans le mois dernier. Comment écrire la requête ??
la requête "fausse" que j'ai écrite est la suivante :
Merci d'avance.Code:SELECT * FROM matable WHERE MONTH(created) = MONTH(NOW()) - 1
Si "created" est bien de type date, que le format est bon (pas de problème d'inversion des jours et mois), je ne vois pas le soucis...
Par exemple sous SQL Server (à adapter pour vous, MySql j'imagine)
renvoie bien 1, 10/01/2012.Code:
1
2
3
4
5
6 with t_tmp(id, maDate) as (select 1, '10/01/2012' union select 2, '05/05/2011') select * from t_tmp where MONTH(maDate)=MONTH(getdate()) - 1
le problème se pose en fait si le mois courant est Janvier
alors MONTH(NOW()) - 1 = 0
et normalement ça devrait être 12...
merci pour votre aide
Exact. Dans ce cas il suffit de rajouter une petite condition dans le where... Je vous laisse trouver :).
merci KookieMonster;
voilà j'ai trouvé la solution :
et ça marche !Code:
1
2 SELECT * FROM matable WHERE DATE_FORMAT(created, '%Y-%m') = DATE_FORMAT(DATE_SUB(NOW(),INTERVAL 1 MONTH), '%Y-%m')
Effectivement votre solution va fonctionner, mais elle n'est pas optimale.
Elle nécessite que votre SGBD formate toute la colonne created avant de pouvoir la filtrer.
Si sur des faibles volumes ce n'est pas perceptible, plus vous aurez de données et plus ce sera long.
Quand ce sera suffisamment long vous envisagerez alors la création d'un index, mais ce dernier ne sera pas utilisé pour cette requête puisque vous appliquez une fonction à cette colonne.
Il vaut mieux appliquer les fonctions de conversions sur vos constantes sans toucher à votre colonne.