2012-05-26 17 views

risposta

15

Cerchiamo di non utilizzare NOW() come si sta perdendo qualsiasi caching delle query o di ottimizzazione perché la query è diverso ogni volta. Consulta l'elenco delle funzioni che non dovresti usare nello MySQL documentation.

Nel codice seguente, supponiamo che questa tabella stia crescendo nel tempo. Vengono aggiunti nuovi elementi e si desidera mostrare solo gli elementi negli ultimi 30 giorni. Questo è il caso più comune.

Si noti che la data è stata aggiunta come stringa. È meglio aggiungere la data in questo modo, dal codice di chiamata, piuttosto che utilizzare la funzione NOW() mentre elimina la cache.

SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY); 

È possibile utilizzare BETWEEN se si vuole veramente solo roba da questa secondo a 30 giorni prima di questo preciso istante, ma non è un caso d'uso comune nella mia esperienza, quindi spero che la query semplificato può servire bene .

+2

Quindi hai proposto di non usare 'NOW()' e lo usi ancora nella tua risposta. o_O PS: la tua query restituirebbe ** un altro risultato **, non quello che OP probabilmente vorrebbe – zerkms

+0

@zerkms Come questa query produrrebbe un set di risultati diverso dalla tua query? – user784637

+1

@ user784637: uhm, 'BETWEEN' e'> = 'sono operatori diversi, sai? La mia query limita il set di risultati per "30 giorni fa AND today", questo "tutto dopo 30 giorni fa".Quindi i record di domani non corrisponderanno alla mia e alla tua query originale, ma corrisponderanno a questa risposta – zerkms

4

giorni Sottrarre MySQL da oggi:

select now(), now() - interval 1 day 

Prints:

2014-10-08 09:00:56  2014-10-07 09:00:56 
75

Per chi non vuole usare DATE_SUB, utilizzare CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY 
+1

Darei questo +10 se potessi. SQL dovrebbe essere tutto di leggibilità e questo è il modo più leggibile per farlo. –

+7

Risultato più leggibile ma diverso dall'uso di 'NOW() - INTERVAL 30 DAY'. Poiché la domanda menziona "sottrarre 30 giorni dall'attuale ** datetime **", potrebbe non essere quello che l'OP vuole. –

0

un'altra way

SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ; 
-1

Se avete solo bisogno la data e non l'uso del tempo:

select*from table where exec_datetime 
between subdate(curdate(), 30)and curdate(); 

Dal curdate() omette la componente temporale, è potentially più veloce di now() e più "semanticamente corretto" nei casi in cui si sta solo interessato alla data.

Inoltre, il sovraccarico a 2 assi di subdate() è potenzialmente più veloce rispetto all'utilizzo di interval. interval è pensato per i casi in cui è necessario un componente non giorno.

+11

Quindi, stai affermando che 'subdate (curdate(), 30)' è più veloce di 'CURRENT_DATE - INTERVAL 30 DAY'? Hai delle prove? E quanto sarebbe veloce? Qualche microsecondo? –

+0

@ypercube, Wow, in che modo il commento ha ottenuto +5 voti in un giorno ... Che cosa hai fatto? Inoltre, ho chiarito nel post che è "potenzialmente più veloce". – Pacerier

+2

Non ne ho idea. Di certo non posso revocare i miei commenti. Riguardo alla rivendicazione "potenzialmente" più veloce, non vedo ancora prove, decisive o circostanziali. E anche se è un po 'più veloce, la condizione verrà valutata una volta. A meno che tu non esegua la query milioni di volte al minuto, la differenza non avrà importanza. –

1
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y') 

È possibile formattare utilizzando il formato data in SQL.

7

È inoltre possibile utilizzare

select CURDATE()-INTERVAL 30 DAY 
Problemi correlati