Wie subtrahiere ich 30 Tage von der aktuellen Datums- / Uhrzeitangabe in MySQL?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Wie subtrahiere ich 30 Tage von der aktuellen Datums- / Uhrzeitangabe in MySQL?
SELECT * FROM table
WHERE exec_datetime BETWEEN DATEDIFF(NOW() - 30 days) AND NOW();
Antworten:
SELECT * FROM table
WHERE exec_datetime BETWEEN DATE_SUB(NOW(), INTERVAL 30 DAY) AND NOW();
http://dev.mysql.com/doc/refman/5.5/de/date-and-time-functions.html#function_date-add
Für alle, die nicht verwenden möchten DATE_SUB
, verwenden Sie CURRENT_DATE
:
SELECT CURRENT_DATE - INTERVAL 30 DAY
NOW() - INTERVAL 30 DAY
. Da in der Frage "30 Tage vom aktuellen Datum abziehen " erwähnt wird, ist dies möglicherweise nicht das, was das OP wünscht.
current_timestamp
anstelle voncurrent_date
Lassen Sie uns nicht verwenden, NOW()
da Sie das Zwischenspeichern oder Optimieren von Abfragen verlieren, da die Abfrage jedes Mal anders ist. Siehe die Liste der Funktionen, die Sie nicht verwenden sollten, in der MySQL-Dokumentation .
Nehmen wir im folgenden Code an, dass diese Tabelle mit der Zeit wächst. Es werden neue Inhalte hinzugefügt, und Sie möchten nur die Inhalte der letzten 30 Tage anzeigen. Dies ist der häufigste Fall.
Beachten Sie, dass das Datum als Zeichenfolge hinzugefügt wurde. Es ist besser, das Datum auf diese Weise aus Ihrem Aufrufcode hinzuzufügen, als die NOW()
Funktion zu verwenden, da sie das Caching beendet.
SELECT * FROM table WHERE exec_datetime >= DATE_SUB('2012-06-12', INTERVAL 30 DAY);
Sie können es verwenden, BETWEEN
wenn Sie wirklich nur Dinge von dieser Sekunde bis 30 Tage vor dieser Sekunde wollen, aber dies ist meiner Erfahrung nach kein häufiger Anwendungsfall, daher hoffe ich, dass die vereinfachte Abfrage Ihnen gute Dienste leisten kann.
NOW()
und sie dennoch in Ihrer Antwort zu verwenden. o_O PS: Ihre Anfrage würde ein anderes Ergebnis zurückgeben, nicht das, was OP wahrscheinlich will
BETWEEN
und >=
sind verschiedene Operatoren, weißt du? Meine Abfrage begrenzt die Ergebnismenge 30 days ago AND today
dafür everything after 30 days ago
. Die tomorrow
Datensätze stimmen also nicht mit meinen und Ihrer ursprünglichen Abfrage überein, sondern mit dieser Antwort
MySQL subtrahiert Tage von jetzt an:
select now(), now() - interval 1 day
Drucke:
2014-10-08 09:00:56 2014-10-07 09:00:56
Andere Argumente der Intervall 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
Sie können auch verwenden
select CURDATE()-INTERVAL 30 DAY
SELECT date_format(current_date - INTERVAL 50 DAY,'%d-%b-%Y')
Sie können mithilfe des Datumsformats in SQL formatieren.
Wenn Sie nur das Datum und nicht die Uhrzeit benötigen, verwenden Sie:
select*from table where exec_datetime
between subdate(curdate(), 30)and curdate();
Da die curdate()
Zeitkomponente weggelassen wird, ist sie möglicherweise schneller now()
und "semantisch korrekter", wenn Sie nur am Datum interessiert sind.
Außerdem ist subdate()
die 2-Arity-Überlastung möglicherweise schneller als die Verwendung interval
.
interval
ist für Fälle gedacht, in denen Sie eine Nicht-Tageskomponente benötigen.
subdate(curdate(), 30)
sei schneller als CURRENT_DATE - INTERVAL 30 DAY
? Hast du Beweise? Und wie schnell wäre das? Ein paar Mikrosekunden?
subdate
, dass es Ihrer Meinung nach wahrscheinlich schneller durch seine "2-Arity-Überlastung" erklärt wird, potenziell schneller zu sein, aber bitte verzeihen Sie mir, wenn dies eine dumme Frage ist, was bedeuten diese Wörter (in Bezug auf eine Funktion) )? Was ist insbesondere "2-Arität"?
curdate()
könnte dies tatsächlich die falsche Wahl sein, da das OP anscheinend "30 Tage von der aktuellen Datumszeit abziehen " wollte (Hervorhebung von mir).