Query MySQL: record tra oggi e gli ultimi 30 giorni


122

Desidero restituire tutti i record aggiunti al database negli ultimi 30 giorni. Devo convertire la data in mm / gg / aa per motivi di visualizzazione.

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

La mia dichiarazione non riesce a limitare i record agli ultimi 30 giorni: seleziona tutti i record.

Qualcuno può indicarmi la giusta direzione? Mi sento come se fossi vicino.

Grazie e buona settimana.

Risposte:


292

Devi applicare DATE_FORMATnella SELECTclausola, non nella WHEREclausola:

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

Si noti inoltre che CURDATE()restituisce solo la DATEparte della data, quindi se si memorizza create_datecome a DATETIMEcon la parte dell'ora riempita, questa query non selezionerà i record di oggi.

In questo caso, dovrai usare NOWinvece:

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

La seconda parte di questa risposta è molto importante! Potrei o meno aver avuto quel problema e mi stavo grattando la testa finché non sono tornato a questa risposta.
Tyler Lazenby

@Quassnoi mi dispiace. Questo sembra essere solo un problema di preparazione di WordPress \ wpdb. Ancora una volta mi dispiace.
vee

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

2
Preferisco questo metodo a BETWEEN CURDATE () - INTERVAL 30
Dan

1
@ErmSo posso sapere perché?
magro

3
Non mentirò - è stato 2 anni fa e non riesco a ricordare! Spiacenti: P
Dan

1
Non c'è bisogno di usareDATE_FORMAT(create_date, '%m/%d/%Y')
kazy

@ Dan preferisco renderlo più leggibile racchiudendo la data precedente tra parentesi: ... WHERE create_date BETWEEN (NOW() - INTERVAL 30 DAY) AND NOW()
Kris Craig

10

DATE_FORMATrestituisce una stringa, quindi stai usando due stringhe nella tua BETWEENclausola, che non funzionerà come ti aspetti.

Invece, converti la data nel tuo formato in SELECTe fai il BETWEENper le date effettive. Per esempio,

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

9

Puoi anche scrivere questo in mysql -

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

FISSO


2
Attenzione: nonostante i voti positivi, seleziona le date nei prossimi 30 giorni / mese, non negli ultimi 30 giorni!
JonBrave

4
D'accordo, dovrebbe essere WHERE create_date> DATE_ADD (NOW (), INTERVAL -1 MONTH);
Bhavik P.

6

Per l'attività della data corrente e l'attività completa per i 30 giorni precedenti, utilizzare questa opzione, poiché SYSDATE è variabile in un giorno, il 30 ° giorno precedente non avrà tutti i dati per quel giorno.

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

1

Ecco una soluzione senza usare la curdate()funzione, questa è una soluzione per coloro che usano TSQLimmagino

SELECT myDate
FROM myTable
WHERE myDate BETWEEN DATEADD(DAY, -30, GETDATE()) AND GETDATE()
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.