Je dois sélectionner toutes les lignes de ma base de données créées le mois dernier. Par exemple, si le mois en cours est janvier, je souhaite renvoyer toutes les lignes créées en décembre, si le mois est février, puis je souhaite renvoyer toutes les lignes créées en janvier. J'ai une colonne date_created
dans ma base de données qui répertorie la date créée dans ce format: 2007-06-05 14:50:17
.MySQL: Requête pour obtenir toutes les lignes du mois précédent
Répondre
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
celui-ci sera en mesure de tirer profit d'un indice si votre date_created est indexé, car elle ne concerne pas une fonction de transformation à la valeur du champ.
@ggiroux - Il faut convertir la date en un type de caractère avant d'appliquer le LIKE. –
oui en effet, mais toujours une amélioration par rapport à la réponse sélectionnée IMHO (IFF date_created est indexée) – ggiroux
Voici une autre alternative. En supposant que vous avez un champ de type indexé DATE
ou DATETIME
, vous devez utiliser l'index car les dates formatées seront converties avant l'utilisation de l'index. Vous devriez alors voir une requête range
plutôt qu'une requête index
lorsqu'elle est affichée avec EXPLAIN.
SELECT
*
FROM
table
WHERE
date_created >= DATE_FORMAT(CURRENT_DATE - INTERVAL 1 MONTH, '%Y/%m/01')
AND
date_created < DATE_FORMAT(CURRENT_DATE, '%Y/%m/01')
S'il n'y a pas des dates futures ...
SELECT *
FROM table_name
WHERE date_created > (NOW() - INTERVAL 1 MONTH);
testé.
Je pense qu'ils cherchaient quelque chose de différent. C'est-à-dire tous les enregistrements du mois dernier (c.-à-d. du 1er octobre au 31 octobre 2012 23:59:59). La requête ci-dessus renvoie les ~ 30 derniers jours environ, à partir de la date et de l'heure * d'aujourd'hui. – Leigh
Alternativement à hobodave's answer
SELECT * FROM table
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH)
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
Vous pouvez obtenir le même avec EXTRACT, en utilisant YEAR_MONTH comme unité, donc vous pas besoin de l'AND, comme ceci:
SELECT * FROM table
WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL
1 MONTH)
Même si la réponse pour cette question a été déjà sélectionné, cependant, je crois que la requête la plus simple sera
SELECT *
FROM table
WHERE
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
Non, pas tout à fait. Voir ma réponse à votre commentaire sur la réponse donnée par @hobodave –
@MattPassell Vous avez raison, j'ai mal compris la question .. J'ai raté le point que le résultat devrait être seulement limité aux enregistrements du mois dernier. –
Voici la requête pour obtenir les enregistrements du dernier mois:
SELECT *
FROM `tablename`
WHERE `datefiled`
BETWEEN DATE_SUB(DATE(NOW()) , INTERVAL 1
MONTH)
AND
LAST_DAY(DATE_SUB(DATE(NOW()) , INTERVAL 1
MONTH))
Cordialement - Saqib
WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY)
AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY)
Cela a fonctionné pour moi (Sélectionner tous les enregistrements créés depuis le mois dernier, quel que soit le jour où vous exécutez la requête ce mois-ci)
SELECT *
FROM yourtable
where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
Ceci devrait renvoyer tous les enregistrements du mois calendaire précédent, par opposition aux enregistrements des 30 ou 31 derniers jours.
J'ai oublié de mentionner ... cela devrait renvoyer tous les enregistrements du mois calendaire précédent, par opposition aux enregistrements des 30 ou 31 derniers jours. – Gregg
À mon avis, cela devrait être la réponse acceptée, car il est plus simple que la réponse acceptée mais fournit le même résultat – Grant
- 1. Instruction SQL pour sélectionner toutes les lignes du jour précédent
- 2. Vous cherchez une requête mysql pour compter toutes les lignes précédentes au mois dernier
- 3. mysql retourner les lignes correspondant année mois
- 4. Requête MySQL: Obtenir toutes les pochettes d'album
- 5. Derniers jours du mois précédent
- 6. Obtenir les dates du premier et du dernier jour du mois précédent en C#
- 7. Requête Mysql pour obtenir des lignes uniques
- 8. requête MySQL pour l'année mois
- 9. Obtenir toutes les lignes parent dans une requête SQL
- 10. Oracle SQL Mois précédent numéro de requête
- 11. MySQL: pour toutes les lignes à l'avant
- 12. comment grouper les lignes MySql en fonction du mois?
- 13. Comment obtenir le jour du mois précédent à ruby?
- 14. Comment obtenir le mois précédent et le prochain mois?
- 15. mysql: obtenir toutes les lignes dans 1 colonne
- 16. MySQL ne tire pas toutes les lignes
- 17. comment inclure les jours du mois précédent dans un calendrier
- 18. précédent - la prochaine requête dans mysql
- 19. extraction de sous-requête - Toutes les lignes
- 20. mysql - obtenir les 10 derniers mois uniques
- 21. Requête pour toutes les lignes avec created_at entre certaines heures?
- 22. requête MySQL pour obtenir les frais
- 23. La requête n'a pas retourné toutes les lignes
- 24. Requête pour obtenir TOUTES les correspondances pour une colonne particulière
- 25. C# .Net Obtenir le dernier jour du mois précédent à partir de la date du jour
- 26. obtenir l'image du contrôleur précédent
- 27. Requête MySQL pour max() de toutes les colonnes
- 28. Comment obtenir les secondes actuelles du mois en cours?
- 29. Requête MYSQL pour obtenir toutes les entrées avec un temps spécifique, à partir de PHP?
- 30. Mysql: Obtenir les résultats de toutes les tables
'SELECT * FROM table OU ENTRE date_created (CURRENT_DATE() - INTERVALLE 1 MOIS) ET CURRENT_DATE();' –
@GhazanfarMir votre requête ne correspond pas tout à fait la question, alors que la réponse ci-dessus, fait. Le vôtre renvoie les lignes entre ce jour le mois dernier et hier. –
@MattPassell Je suis désolé mais 'entre 'est inclus des limites .. Il comprendra également la date actuelle. Pourquoi/Comment cela se limitera-t-il à hier ?? S'il vous plaît élaborer? –