Requête MySQL - Enregistrements entre aujourd'hui et les 30 derniers jours

122

Je souhaite renvoyer tous les enregistrements qui ont été ajoutés à la base de données au cours des 30 derniers jours. J'ai besoin de convertir la date en mm / jj / aa à des fins d'affichage.

create_date between DATE_FORMAT(curdate(),'%m/%d/%Y') AND (DATE_FORMAT(curdate() - interval 30 day,'%m/%d/%Y')) 

Ma déclaration ne parvient pas à limiter les enregistrements aux 30 derniers jours - il sélectionne tous les enregistrements.

Est-ce que quelqu'un peut-il me montrer la bonne direction? J'ai l'impression d'être proche.

Merci et bonne semaine.

Jason Sweet
la source

Réponses:

292

Vous devez appliquer DATE_FORMATdans la SELECTclause, pas dans la WHEREclause:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND CURDATE()

Notez également que CURDATE()renvoie uniquement la DATEpartie de la date, donc si vous stockez en create_datetant que DATETIMEavec la partie heure remplie, cette requête ne sélectionnera pas les enregistrements du jour.

Dans ce cas, vous devrez utiliser à la NOWplace:

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date BETWEEN NOW() - INTERVAL 30 DAY AND NOW()
Quassnoi
la source
La deuxième partie de cette réponse est très importante! J'ai peut-être eu ce problème ou non et je me grattais la tête jusqu'à ce que je revienne à cette réponse.
Tyler Lazenby
@Quassnoi Je suis désolé. Cela semble être le problème de préparation de WordPress \ wpdb uniquement. Encore pardon.
vee
56
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
Thinkcast
la source
2
Je préfère cette méthode à BETWEEN CURDATE () - INTERVAL 30
Dan
1
@ErmSi puis-je savoir pourquoi?
slim
3
Je ne mentirai pas - c'était il y a 2 ans et je ne m'en souviens plus! Désolé: P
Dan
1
Pas besoin d'utiliserDATE_FORMAT(create_date, '%m/%d/%Y')
kazy
@Dan je préfère le rendre plus lisible en mettant la date précédente entre parenthèses: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig
10

DATE_FORMATrenvoie une chaîne, vous utilisez donc deux chaînes dans votre BETWEENclause, ce qui ne fonctionnera pas comme prévu.

Au lieu de cela, convertissez la date dans votre format dans le SELECTet faites le BETWEENpour les dates réelles. Par exemple,

SELECT DATE_FORMAT(create_date, '%m/%d/%y') as create_date_formatted
FROM table
WHERE create_date BETWEEN (CURDATE() - INTERVAL 30 DAY) AND CURDATE()
Rich Adams
la source
9

Vous pouvez également écrire ceci dans mysql -

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM    mytable
WHERE   create_date < DATE_ADD(NOW(), INTERVAL -1 MONTH);

FIXÉ

Rohit Suthar
la source
2
Attention: malgré les votes positifs, cela sélectionne les dates dans les 30 prochains jours / mois, pas dans les 30 derniers jours!
JonBrave
4
D'accord, devrait être WHERE create_date> DATE_ADD (NOW (), INTERVAL -1 MOIS);
Bhavik P.
6

Pour l'activité de date actuelle et l'activité complète des 30 jours précédents, utilisez ceci, car le SYSDATE est variable dans un jour, le 30ème jour précédent n'aura pas toutes les données pour ce jour.

SELECT  DATE_FORMAT(create_date, '%m/%d/%Y')
FROM mytable
WHERE create_date BETWEEN CURDATE() - INTERVAL 30 DAY AND SYSDATE()
onlybymyexerperience
la source
1

Voici une solution sans utiliser de curdate()fonction, c'est une solution pour ceux qui utilisent TSQLje suppose

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
mvirant
la source