Je dois sélectionner toutes les lignes de ma base de données qui ont été 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, je souhaite renvoyer toutes les lignes créées en janvier. J'ai une date_created
colonne dans ma base de données répertoriant les date de création dans ce format: 2007-06-05 14:50:17
.
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
between
inclut les limites. Il inclura également la date actuelle. Pourquoi / comment se limitera-t-il à hier ?? Veuillez préciser?current_date
ce n'est pas aujourd'hui mais une date aléatoire donnée par le client?Voici une autre alternative. En supposant que vous ayez un champ indexé
DATE
ou deDATETIME
type, celui-ci doit utiliser l'index car les dates formatées seront converties avant l'utilisation de l'index. Vous devriez alors voir unerange
requête plutôt qu'uneindex
requête lors de la visualisation 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' )
la source
STR_TO_DATE
autour duDATE_FORMAT
afin qu'il traite toujours des objets de date.S'il n'y a pas de dates futures ...
SELECT * FROM table_name WHERE date_created > (NOW() - INTERVAL 1 MONTH);
Testé.
la source
Alternativement à la réponse d' Hobodave
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 la même chose avec EXTRACT, en utilisant YEAR_MONTH comme unité, vous n'aurez donc pas besoin du AND, comme ceci:
SELECT * FROM table WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 1 MONTH)
la source
YEAR_WEEK
intervalle temporel , vous devrez donc vous rabattre sur la réponse de hobodave si vous avez besoin de semaines au lieu de mois.SELECT * FROM yourtable where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m')
Cela devrait renvoyer tous les enregistrements du mois civil précédent, par opposition aux enregistrements des 30 ou 31 derniers jours.
la source
Même si la réponse à cette question a déjà été sélectionnée, je pense que la requête la plus simple sera
SELECT * FROM table WHERE date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE();
la source
Cela a fonctionné pour moi (sélectionne tous les enregistrements créés le mois dernier, quel que soit le jour où vous exécutez la requête ce mois-ci)
la source
select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');
celui-ci pourra profiter d'un index si votre date_created est indexé, car il n'applique aucune fonction de transformation à la valeur du champ.
la source
Voici la requête pour obtenir les enregistrements du mois dernier:
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
la source
Alternative à condition unique
SELECT * FROM table WHERE YEAR(date_created) * 12 + MONTH(date_created) = YEAR(CURRENT_DATE) * 12 + MONTH(CURRENT_DATE) - 1
la source
SELECT * FROM table WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH)
la source