Come sottrarre 30 giorni dall'attuale datetime in mysql?


197

Come posso sottrarre 30 giorni dal datetime corrente in mysql?

SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();

Risposte:



128

Per chiunque non voglia usare DATE_SUB, usare CURRENT_DATE:

SELECT CURRENT_DATE - INTERVAL 30 DAY

2
Darei questo +10 se potessi. SQL dovrebbe essere tutto sulla leggibilità e questo è il modo più leggibile per farlo.
Colin 't Hart,

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

2
@ ypercubeᵀᴹ quindi usa current_timestampinvece dicurrent_date
isapir il

21

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.


3
Quindi hai proposto di non servirti NOW()e di usarlo ancora nella tua risposta. o_O PS: la tua query restituirebbe un altro risultato, non quello che probabilmente OP vuole
zerkms,

@zerkms In che modo questa query produrrebbe un set di risultati diverso dalla query?
user784637,

2
@ user784637: uhm, 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
zerkms

Ok, mio ​​male. In genere tali query si trovano nelle tabelle live che crescono nel tempo. Ecco perché ho lasciato cadere il mezzo. Ho chiarito la mia risposta sopra.
Joseph Lust,

@JosephLust, Per risolvere i problemi di prestazioni, usa invece la mia soluzione .
Pacerier

17

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 


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

È possibile formattare utilizzando il formato data in SQL.


0

un altro modo

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

0

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.


11
Quindi, stai sostenendo che subdate(curdate(), 30)è più facile di CURRENT_DATE - INTERVAL 30 DAY? Hai delle prove? E quanto sarebbe veloce? Qualche microsecondo?
ypercubeᵀᴹ

2
Non ne ho idea. Certamente non posso votare i miei commenti. Riguardo all'affermazione "potenzialmente" più rapida, non vedo ancora alcuna prova, decisiva o circostanziale. E anche se è un po 'più veloce, la condizione verrebbe valutata una volta. A meno che non si esegua la query milioni di volte al minuto, la differenza non avrà importanza.
ypercubeᵀᴹ

2
Immagino 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"?
Andriy M,

1
Inoltre, per quanto riguarda la formulazione della domanda, curdate()potrebbe effettivamente essere la scelta sbagliata, perché l'OP sembrava voler "sottrarre 30 giorni dall'attuale datetime " (sottolineatura mia).
Andriy M,

1
@AndriyM, Beh, poiché questa discussione sta ottenendo 50.000 visualizzazioni, lascerò la risposta qui per le persone interessate solo alla componente temporale. E per quanto riguarda "arity", si riferisce al numero di argomenti . Sì, è corretto, a parità di condizioni, una funzione 2-arity è potenzialmente più veloce di una 3-arity. Ciò rimarrà vero fino a quando non verranno aggiunte nuove informazioni al piatto.
Pacerier,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.