2010-01-19 22 views
54

Devo selezionare tutte le righe nel mio database che sono state create il mese scorso.MySQL: query per ottenere tutte le righe del mese precedente

Ad esempio, se il mese corrente è gennaio, allora voglio restituire tutte le righe che sono state create a dicembre, se il mese è febbraio, quindi voglio restituire tutte le righe che sono state create a gennaio. Ho una colonna date_created nel mio database che elenca la data creata in questo formato: 2007-06-05 14:50:17.

risposta

123
SELECT * FROM table 
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) 
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 
+38

'SELECT * FROM Tabella WHERE DATE_CREATED TRA (CURRENT_DATE() - INTERVALLO 1 mese) e CURRENT_DATE();' –

+3

@GhazanfarMir la query non corrispondono del tutto la questione, mentre la risposta di cui sopra, lo fa. Il tuo restituisce le righe tra questo giorno lo scorso mese fino a ieri. –

+0

@MattPassell Mi dispiace ma 'between' è comprensivo dei limiti .. Comprenderà anche la data corrente. Perché/Come sarà limitato a ieri ?? Si prega di elaborare? –

0

select fields FROM table WHERE date_created LIKE concat(LEFT(DATE_SUB(NOW(), interval 1 month),7),'%');

questo potrà usufruire di un indice se il date_created è indicizzato, perché non applica alcuna funzione di trasformazione per il valore del campo.

+0

@ggiroux - Deve convertire la data in un tipo di carattere prima di applicare il LIKE però. –

+0

sì, ma ancora un miglioramento rispetto alla risposta selezionata IMHO (IFF date_created è indicizzato) – ggiroux

16

Ecco un'altra alternativa. Supponendo di avere un campo indicizzato DATE o DATETIME, questo dovrebbe utilizzare l'indice poiché le date formattate verranno convertite in tipo prima che venga utilizzato l'indice. Dovresti quindi vedere una query range anziché una query index quando visualizzata con 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') 
+1

questo ti farà ottenere i record che sono stati creati il ​​primo giorno del mese corrente però. – ggiroux

+0

@ggiroux - Infatti. Grazie - risolto. –

+0

+1 - molto più pulito del mio :) – ggiroux

9

Se non ci sono le date future ...

SELECT * 
FROM table_name 
WHERE date_created > (NOW() - INTERVAL 1 MONTH); 

Provato.

+1

Penso che stessero cercando qualcosa di diverso. vale a dire tutti i record del mese scorso (ad esempio 1 ottobre - 31 ottobre 2012 23:59:59). La query sopra restituirà gli ultimi ~ 30 giorni circa, dalla data odierna e * ora *. – Leigh

8

alternativa a hobodave's answer

SELECT * FROM table 
WHERE YEAR(date_created) = YEAR(CURRENT_DATE - INTERVAL 1 MONTH) 
AND MONTH(date_created) = MONTH(CURRENT_DATE - INTERVAL 1 MONTH) 

Si potrebbe ottenere lo stesso con l'estratto, utilizzando YEAR_MONTH come unità, quindi non avrebbe bisogno AND, in questo modo:

SELECT * FROM table 
WHERE EXTRACT(YEAR_MONTH FROM date_created) = EXTRACT(YEAR_MONTH FROM CURDATE() - INTERVAL 
1 MONTH) 
0

Anche se la risposta per questa domanda è già stata selezionata, tuttavia, credo che la domanda più semplice sarà

SELECT * 
FROM table 
WHERE 
date_created BETWEEN (CURRENT_DATE() - INTERVAL 1 MONTH) AND CURRENT_DATE(); 
+1

No, non proprio. Vedi la mia risposta al tuo commento sulla risposta data da @hobodave –

+0

@MattPassell Hai ragione, ho frainteso la domanda .. Ho perso il punto che il risultato dovrebbe essere limitato solo ai record SOLO dal mese scorso. –

1

Ecco la query per ottenere i record del mese scorso:

SELECT * 
FROM `tablename` 
WHERE `datefiled` 
BETWEEN DATE_SUB(DATE(NOW()) , INTERVAL 1 
MONTH) 
AND 
LAST_DAY(DATE_SUB(DATE(NOW()) , INTERVAL 1 
MONTH)) 

Saluti - Saqib

0
WHERE created_date >= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 2 MONTH)), INTERVAL 1 DAY) 
    AND created_date <= DATE_ADD(LAST_DAY(DATE_SUB(NOW(), INTERVAL 1 MONTH)), INTERVAL 0 DAY) 

Questo ha funzionato per me (di selezionare tutti i record creati dal mese scorso, a prescindere dal giorno eseguire la query questo mese)

1
SELECT * 
FROM yourtable 
where DATE_FORMAT(date_created, '%Y-%m') = date_format(DATE_SUB(curdate(), INTERVAL 1 month),'%Y-%m') 

Questo dovrebbe restituire tutti i record del mese di calendario precedente, in contrapposizione ai record degli ultimi 30 o 31 giorni.

+0

Ho dimenticato di menzionare ... questo dovrebbe restituire tutti i record del mese di calendario precedente, in contrapposizione ai record degli ultimi 30 o 31 giorni. – Gregg

+0

Secondo me questa dovrebbe essere la risposta accettata in quanto è più semplice della risposta accettata ma fornisce lo stesso risultato – Grant

Problemi correlati