Come posso sottrarre 30 giorni dal datetime corrente in mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Come posso sottrarre 30 giorni dal datetime corrente in mysql?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Risposte:
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
Per chiunque non voglia usare DATE_SUB, usare CURRENT_DATE:
SELECT CURRENT_DATE - INTERVAL 30 DAY
NOW() - INTERVAL 30 DAY. Poiché la domanda menziona "sottrarre 30 giorni dall'attuale datetime ", potrebbe non essere quello che l'OP vuole.
current_timestampinvece dicurrent_date
Non usiamo NOW()perché stai perdendo la memorizzazione nella cache o l'ottimizzazione della query perché la query è diversa ogni volta. Vedi l'elenco delle funzioni che non dovresti usare nella documentazione di MySQL .
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 una stringa. È meglio aggiungere la data in questo modo, dal codice chiamante, piuttosto che utilizzare la NOW()funzione in quanto uccide la memorizzazione nella cache.
SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
Puoi usarlo BETWEENse vuoi davvero cose da questo secondo a 30 giorni prima di questo secondo, ma questo non è un caso d'uso comune nella mia esperienza, quindi spero che la query semplificata ti possa servire bene.
NOW()e di usarlo ancora nella tua risposta. o_O PS: la tua query restituirebbe un altro risultato, non quello che probabilmente OP vuole
BETWEENe >=sono diversi operatori, sai? La mia query limita il set di risultati per 30 days ago AND todayquesto everything after 30 days ago. Quindi i tomorrowrecord non corrisponderanno alla mia e alla tua query originale, ma corrisponderanno a questa risposta
MySQL sottrae giorni da adesso:
select now(), now() - interval 1 day
stampe:
2014-10-08 09:00:56 2014-10-07 09:00:56
Altri argomenti dell'Interval Temporal Expression Unit:
https://dev.mysql.com/doc/refman/5.5/en/expressions.html#temporal-intervals
select now() - interval 1 microsecond
select now() - interval 1 second
select now() - interval 1 minute
select now() - interval 1 hour
select now() - interval 1 day
select now() - interval 1 week
select now() - interval 1 month
select now() - interval 1 year
Puoi anche usare
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
È possibile formattare utilizzando il formato data in SQL.
Se hai solo bisogno della data e non dell'ora, usa:
select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();
Poiché curdate()omette la componente temporale, è potenzialmente più veloce now()e più "semanticamente corretto" nei casi in cui sei interessato solo alla data.
Inoltre, subdate()il sovraccarico a 2 aree è potenzialmente più veloce dell'uso interval.
intervalè pensato per i casi in cui è necessario un componente non giornaliero.
subdate(curdate(), 30)è più facile di CURRENT_DATE - INTERVAL 30 DAY? Hai delle prove? E quanto sarebbe veloce? Qualche microsecondo?
subdateche essere potenzialmente più veloce sia probabilmente in qualche modo spiegato, secondo te, dal suo "sovraccarico di 2 arità", ma, per favore, perdonami se questa è una domanda stupida, cosa significano quelle parole (rispetto a una funzione )? In particolare, che cos'è "2-arity"?
curdate()potrebbe effettivamente essere la scelta sbagliata, perché l'OP sembrava voler "sottrarre 30 giorni dall'attuale datetime " (sottolineatura mia).