130 votes

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

Je veux renvoyer tous les enregistrements qui ont été ajoutés à la base de données au cours des 30 derniers jours. Je dois convertir la date en mm/jj/aa pour des raisons d'affichage.

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

Mon relevé ne parvient pas à limiter les enregistrements aux 30 derniers jours - il sélectionne tous les enregistrements.

Quelqu'un peut-il m'indiquer la bonne direction ? J'ai l'impression d'être proche.

Merci et bonne semaine.

313voto

Quassnoi Points 191041

Vous devez appliquer DATE_FORMAT dans le SELECT et non la clause WHERE clause :

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

Notez également que CURDATE() ne renvoie que le DATE de la date, donc si vous stockez create_date en tant que DATETIME avec la partie temps remplie, cette requête ne sélectionnera pas les enregistrements du jour.

Dans ce cas, vous devrez utiliser NOW à la place :

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

1 votes

La deuxième partie de cette réponse est très importante ! J'ai eu ou non ce problème et je me suis gratté la tête jusqu'à ce que je revienne à cette réponse.

0 votes

@Quassnoi Je suis désolé. Cela semble être WordPress \wpdb préparer le problème uniquement. Désolé encore.

61voto

Thinkcast Points 221
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();

2 votes

Je préfère cette méthode à BETWEEN CURDATE() - INTERVALLE 30

1 votes

@ErmSo puis-je savoir pourquoi ?

3 votes

Je ne vais pas mentir - c'était il y a 2 ans et je ne m'en souviens pas ! Désolé :P

11voto

Rich Adams Points 10378

DATE_FORMAT renvoie une chaîne de caractères. Vous utilisez donc deux chaînes de caractères dans votre fichier BETWEEN ce qui ne va pas fonctionner comme vous le souhaitez.

Au lieu de cela, convertissez la date dans votre format dans le champ SELECT et faire le BETWEEN pour 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()

11voto

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

FIXE

3 votes

Attention : malgré les votes positifs, cela sélectionne les dates dans la liste des dates de l'année. suivant 30 jours/mois, et non le dernier 30 jours !

4 votes

D'accord, cela devrait être WHERE create_date > DATE_ADD(NOW(), INTERVAL -1 MONTH) ;

8voto

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

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X