2012-09-06 12 views
7

fino a oggi quando stavo lavorando con MySQL e dovevo eseguire azioni con data/ora stavo usando int column con timestamp unix e non c'erano problemi, ma oggi dopo aver letto alcune guide ho deciso di prova la colonna timestamp con "current_timestamp" per impostazione predefinita.MySQL Seleziona i dati del mese scorso da current_timestamp

Quindi sono interessato a selezionare i dati del mese scorso per colonna in cui le informazioni sono nel formato "2012-09-07 00:23:30"? E forse ci sono alcune domande complicate che mi daranno i dati dall'inizio di questo mese (non negli ultimi 30 giorni, ma dalle 09-01 00:00:00 fino ad oggi)?

+0

Ho affrontato un problema simile non molto tempo fa e ho finito per calcolare le date attraverso il linguaggio lato server (in questo caso php, ma qualunque ti permetterà di farlo). Ad ogni modo, interessato anche a questo :) – jribeiro

+0

@jribeiro Pubblicato una risposta, dai un'occhiata. – Ariel

risposta

17

Questo vi darà l'ultimo mese:

WHERE dateColumn BETWEEN SUBDATE(CURDATE(), INTERVAL 1 MONTH) AND NOW(); 

Questa dall'inizio del mese:

WHERE dateColumn BETWEEN STR_TO_DATE('2012-09-01', '%Y-%m-%d') AND NOW(); 

Il TRA è niente di speciale, è solo una scorciatoia per

dateColumn <= ... AND dateColumn >= .... 

Hmm, immagino che il confronto NOW() non sia effettivamente necessario, dal momento che tutti i record saranno prima d'ora.

Quindi basta fare:

WHERE dateColumn >= STR_TO_DATE('2012-09-01', '%Y-%m-%d') 

dinamica inizio del mese corrente:

WHERE dateColumn >= CURDATE() - INTERVAL DAY(CURDATE())-1 DAY 

Tutto questo non fa estrarre il giorno del mese dalla data corrente, quindi sottrarre che molti giorni meno uno da.

+0

Il problema che vedo è se la query deve essere dinamica. Lo faccio, ma devo ancora trovare l'inizio del mese sul lato server. Ma forse questo va oltre ciò che l'OP ha richiesto. :) – jribeiro

+0

@jribeiro Dynamic non è un problema - Ho aggiornato la risposta. – Ariel

3

Si dovrebbe dare un'occhiata a common_schema, è facile da installare ed ha un sacco di grandi strumenti, tra cui una funzione chiamata start_of_month() che è esattamente quello che stai cercando:

select * 
from your_table 
where your_column >= common_schema.start_of_month(now()) 
-1

Se si dispone di un timestamp mysql , qualcosa come 2013-09-29 22:27:10 si può fare questo

select * from table WHERE MONTH(FROM_UNIXTIME(UNIX_TIMESTAMP(time)))=9; 

Converti in UNIX, quindi utilizzare le funzioni di tempo unix per estrarre il mese, in questo caso 9 per settembre.

+1

ancora meglio 'seleziona * dalla tabella dove MESE (tempo) = (MESE (ORA()));' – Federico

+0

Che dire di questo mese l'anno prossimo? – Mala

+0

forse selezionare * dalla tabella dove MONTH (tempo) = (MONTH (NOW())) e YEAR (time) = YEAR (NOW())); – Stenyg