MySQL wybiera wczorajszą datę

102

Jak mogę wyświetlić i policzyć wartości, których daty są wczorajsze? Kiedyś time()wstawiałem datę do bazy danych. Przykład:

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

Chcę wyświetlić, ile adresów URL istnieje wiele w tabeli, a także ile z tych adresów URL zostało odwiedzonych wczoraj. Przykładowy wynik:

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

Mam już pomysł na uzyskanie wczorajszej daty, ale nie mam pomysłu na policzenie, ile razy URL istniał wczoraj i zliczanie, ile razy adres URL istniał w tabeli.

PinoyStackOverflower
źródło

Odpowiedzi:

167

Najprostszym i najlepszym sposobem na uzyskanie wczorajszej randki jest:

subdate(current_date, 1)

Twoje zapytanie brzmiałoby:

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

Dla ciekawostki powodem, dla którego sum(condition)podaje się liczbę wierszy spełniających warunek, co w innym przypadku wymagałoby kłopotliwej i rozwlekłej caseinstrukcji, jest to, że w mysql wartości logiczne są 1dla prawdy i 0fałszu, więc sumowanie warunku skutecznie liczy ile razy to prawda. Użycie tego wzorca może uporządkować kod SQL.

Czeski
źródło
91
SELECT SUBDATE(NOW(),1);

Funkcja where now () zwraca aktualną datę i godzinę systemu w Timestamp ...

możesz użyć:

SELECT SUBDATE(CURDATE(),1)
Romancha KC
źródło
3
Pracował dla mnie. Wielkie dzięki
mable george
20

Możesz użyć:

SELECT SUBDATE(NOW(), 1);

lub

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

lub

SELECT NOW() - INTERVAL 1 DAY;

lub

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
simhumileco
źródło
11

Możesz uzyskać wczorajszą datę, używając wyrażenia CAST(NOW() - INTERVAL 1 DAY AS DATE). Więc coś takiego może działać:

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
cdhowie
źródło
9

Zapytanie z ostatnich tygodni:

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()
NCrash
źródło
9

Obliczanie ostatniego lub następnego dnia, tygodnia, miesiąca i roku. To może być pomocne dla każdego.

Bieżąca data:

select curdate();

Wczoraj:

select subdate(curdate(), 1)

Jutro:

select adddate(curdate(), 1)

Ostatni tydzień:

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

Następny tydzień:

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

Ostatni 1 miesiąc:

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

Następny miesiąc:

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

Obecny miesiąc:

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

Ostatni rok:

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

Następny rok:

between adddate(curdate(), 365) and adddate(curdate(), 1)
Atequer Rahman
źródło
7

Chociaż wybrana odpowiedź jest poprawna i bardziej zwięzła, argumentowałbym za strukturą opisaną w innych odpowiedziach:

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));

Jeśli potrzebujesz tylko samej daty bez znacznika czasu, możesz również zapisać ją w następujący sposób:

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

Powodem użycia CASTversus SUBDATEjest CASTskładnia ANSI SQL. SUBDATEjest specyficzną dla MySQL implementacją składnika arytmetycznego dat CAST. Nabycie nawyku używania składni ANSI może zmniejszyć ból głowy w przypadku migracji do innej bazy danych. Dobrze jest też mieć nawyk jako profesjonalna praktyka, ponieważ prawie na pewno będziesz pracować z innymi DBMS w przyszłości.

Żaden z głównych systemów DBMS nie jest w pełni zgodny z ANSI, ale większość z nich implementuje szeroki zestaw składni ANSI, podczas gdy prawie żaden z nich poza MySQL i jego potomkami (MariaDB, Percona itp.) Nie implementuje składni specyficznej dla MySQL.

trclark81
źródło
Dobre wyjaśnienia, dlaczego ktoś wybrałby jedno zamiast drugiego.
Sablefoste
4

Zaadaptowałem jedną z powyższych odpowiedzi z cdhowie, ponieważ nie mogłem jej zmusić do działania. To wydaje się działać dla mnie. Podejrzewam, że można to również zrobić przy użyciu funkcji UNIX_TIMESTAMP.

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
źródło