web-dev-qa-db-fra.com

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

Je souhaite renvoyer tous les enregistrements 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')) 

Ma déclaration ne limite pas les enregistrements aux 30 derniers jours - elle 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.

108
Jason Sweet

Vous devez appliquer DATE_FORMAT dans la clause SELECT, pas la clause WHERE:

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 la partie DATE de la date. Par conséquent, si vous stockez create_date en tant que DATETIME avec la partie heure renseignée, cette requête ne sélectionnera pas la date du jour. enregistrements.

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()
254
Quassnoi
SELECT
    *
FROM
    < table_name >
WHERE
    < date_field > BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY)
AND NOW();
53
Thinkcast

DATE_FORMAT renvoie une chaîne. Vous utilisez donc deux chaînes dans votre clause BETWEEN, qui ne fonctionnera pas comme prévu.

Au lieu de cela, convertissez la date à votre format dans la SELECT et effectuez la 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()
10
Rich Adams

Vous pouvez aussi écrire ceci dans mysql -

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

Utilisez ceci pour l'activité de date en cours et pour l'activité complète des 30 derniers jours, car le SYSDATE est variable dans une journée. Les 30 dernières journées ne contiendront pas toutes les données de cette journée.

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

Voici une solution sans utiliser la fonction curdate(), c'est une solution pour ceux qui utilisent TSQL Je suppose

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