2010-01-19 7 views
54

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

123
SELECT * FROM table 
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) 
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
+38

'SELECT * FROM table OU ENTRE date_created (CURRENT_DATE() - INTERVALLE 1 MOIS) ET CURRENT_DATE();' –

+3

@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. –

+0

@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? –

0

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.

+0

@ggiroux - Il faut convertir la date en un type de caractère avant d'appliquer le LIKE. –

+0

oui en effet, mais toujours une amélioration par rapport à la réponse sélectionnée IMHO (IFF date_created est indexée) – ggiroux

16

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') 
+1

cela vous donnera les enregistrements qui ont été créés le premier jour du mois en cours cependant. – ggiroux

+0

@ggiroux - En effet. Merci - fixé. –

+0

+1 alors - beaucoup plus propre que le mien :) – ggiroux

9

S'il n'y a pas des dates futures ...

SELECT * 
FROM table_name 
WHERE date_created > (NOW() - INTERVAL 1 MONTH); 

testé.

+1

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

8

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) 
0

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(); 
+1

Non, pas tout à fait. Voir ma réponse à votre commentaire sur la réponse donnée par @hobodave –

+0

@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. –

1

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

0
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)

1
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.

+0

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

+0

À 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

Questions connexes