Come sottrarre 30 giorni dal datetime corrente in mysql?Come sottrarre 30 giorni dal datetime corrente in mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Come sottrarre 30 giorni dal datetime corrente in mysql?Come sottrarre 30 giorni dal datetime corrente in mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add
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 .
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
@zerkms Come questa query produrrebbe un set di risultati diverso dalla tua query? – user784637
@ 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
giorni Sottrarre MySQL da oggi:
select now(), now() - interval 1 day
Prints:
2014-10-08 09:00:56 2014-10-07 09:00:56
Per chi non vuole usare DATE_SUB
, utilizzare CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
Darei questo +10 se potessi. SQL dovrebbe essere tutto di leggibilità e questo è il modo più leggibile per farlo. –
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. –
un'altra way
SELECT COUNT(*) FROM tbl_debug WHERE TO_DAYS(`when`) < TO_DAYS(NOW())-30 ;
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.
Quindi, stai affermando che 'subdate (curdate(), 30)' è più veloce di 'CURRENT_DATE - INTERVAL 30 DAY'? Hai delle prove? E quanto sarebbe veloce? Qualche microsecondo? –
@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
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. –
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
È possibile formattare utilizzando il formato data in SQL.
È inoltre possibile utilizzare
select CURDATE()-INTERVAL 30 DAY
impressionante! grazie – deFreitas