MySQL wählt das gestrige Datum aus

101

Wie kann ich die Werte anzeigen und zählen, deren Datum gestern ist? Ich habe das time()Datum in die Datenbank eingefügt. Beispiel:

URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314

Ich möchte anzeigen, wie viele URLs mit mehreren in der Tabelle vorhanden sind und wie viele dieser URLs gestern besucht wurden. Beispielergebnis:

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

Ich habe bereits die Idee, das Datum von gestern zu ermitteln, aber ich habe keine Idee, zu zählen, wie oft eine URL für gestern existiert hat und wie oft eine URL in der Tabelle existiert hat.

PinoyStackOverflower
quelle

Antworten:

165

Der einfachste und beste Weg, um das gestrige Datum zu erhalten, ist:

subdate(current_date, 1)

Ihre Anfrage wäre:

SELECT 
    url as LINK,
    count(*) as timesExisted,
    sum(DateVisited between UNIX_TIMESTAMP(subdate(current_date, 1)) and
        UNIX_TIMESTAMP(current_date)) as timesVisitedYesterday
FROM mytable
GROUP BY 1

Für Neugierige ist der Grund, sum(condition)der Ihnen die Anzahl der Zeilen angibt, die die Bedingung erfüllen, was andernfalls eine umständliche und wortreiche caseAussage erfordern würde , dass in MySQL boolesche Werte 1für wahr und 0falsch sind, sodass das Summieren einer Bedingung effektiv zählt, wie oft es ist wahr. Die Verwendung dieses Musters kann Ihren SQL-Code zerstören.

Böhmisch
quelle
89
SELECT SUBDATE(NOW(),1);

Wobei die Funktion now () das aktuelle Datum und die aktuelle Uhrzeit des Systems im Zeitstempel zurücksetzt ...

Sie können verwenden:

SELECT SUBDATE(CURDATE(),1)
Romancha KC
quelle
3
Hat für mich gearbeitet. Vielen Dank
mable george
19

Sie können verwenden:

SELECT SUBDATE(NOW(), 1);

oder

SELECT SUBDATE(NOW(), INTERVAL 1 DAY);

oder

SELECT NOW() - INTERVAL 1 DAY;

oder

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
simhumileco
quelle
11

Sie können das gestrige Datum mit dem Ausdruck abrufen CAST(NOW() - INTERVAL 1 DAY AS DATE). So etwas könnte also funktionieren:

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
cdhowie
quelle
9

Abfrage für die letzten Wochen:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()
NCrash
quelle
9

Berechnung des letzten oder nächsten Datums, der Woche, des Monats und des Jahres. Es könnte für jeden hilfreich sein.

Aktuelles Datum:

select curdate();

Gestern:

select subdate(curdate(), 1)

Morgen:

select adddate(curdate(), 1)

Letzte 1 Woche:

select between subdate(curdate(), 7) and subdate(curdate(), 1)

Nächste 1 Woche:

between adddate(curdate(), 7) and adddate(curdate(), 1)

Letzter 1 Monat:

between subdate(curdate(), 30) and subdate(curdate(), 1)

Nächster 1 Monat:

between adddate(curdate(), 30) and adddate(curdate(), 1)

Aktueller Monat:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

Letztes 1 Jahr:

between subdate(curdate(), 365) and subdate(curdate(), 1)

Nächstes 1 Jahr:

between adddate(curdate(), 365) and adddate(curdate(), 1)
Atequer Rahman
quelle
7

Während die gewählte Antwort korrekt und prägnanter ist, würde ich für die in anderen Antworten angegebene Struktur argumentieren:

SELECT * FROM your_table
WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));

Wenn Sie nur ein nacktes Datum ohne Zeitstempel benötigen, können Sie es auch wie folgt schreiben:

SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
  AND DateVisited <= CAST(NOW() AS DATE);

Der Grund für die Verwendung von CASTversus SUBDATEist CASTdie ANSI-SQL-Syntax. SUBDATEist eine MySQL-spezifische Implementierung der Datumsarithmetikkomponente vonCAST . Wenn Sie sich an die Verwendung der ANSI-Syntax gewöhnen, können Sie Kopfschmerzen reduzieren, falls Sie jemals auf eine andere Datenbank migrieren müssen. Es ist auch gut, als Berufspraxis die Gewohnheit zu haben, da Sie in Zukunft mit ziemlicher Sicherheit mit anderen DBMS zusammenarbeiten werden.

Keines der wichtigsten DBMS-Systeme ist vollständig ANSI-kompatibel, aber die meisten von ihnen implementieren die breite ANSI-Syntax, während fast keines außerhalb von MySQL und seinen Nachkommen (MariaDB, Percona usw.) die MySQL-spezifische Syntax implementiert.

trclark81
quelle
Gute Erklärungen, warum man sich für einen entscheiden würde.
Sablefoste
4

Ich habe eine der obigen Antworten von cdhowie angepasst, da ich sie nicht zum Laufen bringen konnte. Das scheint bei mir zu funktionieren. Ich vermute, dass dies auch mit der verwendeten UNIX_TIMESTAMP-Funktion möglich ist.

SELECT * FROM your_table

WHERE UNIX_TIMESTAMP(DateVisited) >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND UNIX_TIMESTAMP(DateVisited) <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
John-Paul Stanford
quelle