MySQL вибирає дату вчора


101

Як я можу відобразити та підрахувати значення, дати яких вчора? Раніше я time()вставляв дату в базу даних. Приклад:

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

Я хочу показати, скільки URL-адрес, які кілька разів існували в таблиці, а також скільки з цих URL-адрес було відвідано вчора. Приклад результату:

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

У мене вже є ідея отримати вчорашню дату, але я не маю ідеї підрахувати, скільки разів існувала URL-адреса за вчорашній день, і підрахувати, скільки разів URL-адреса існувала в таблиці.

Відповіді:


166

Найпростіший і найкращий спосіб отримати дату вчора:

subdate(current_date, 1)

Ваш запит буде:

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

Для цікавих, причина, яка sum(condition)дає вам підрахунок рядків, що задовольняють умові, яка в іншому випадку вимагала би громіздкого і багатослівного caseвисловлювання, полягає в тому, що в mysql булеві значення мають значення 1true і 0false, тому підсумовуючи умову, ефективно підраховується, скільки разів це правда. Використання цього шаблону може покращити ваш SQL-код.


89
SELECT SUBDATE(NOW(),1);

де функція now () повертає поточну дату та час роботи системи у позначці часу ...

Ви можете використовувати:

SELECT SUBDATE(CURDATE(),1)

3
Працювали для мене. Велике спасибі
Мейбл Джордж

20

Ви можете використовувати:

SELECT SUBDATE(NOW(), 1);

або

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

або

SELECT NOW() - INTERVAL 1 DAY;

або

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

11

Ви можете отримати дату вчора за допомогою виразу CAST(NOW() - INTERVAL 1 DAY AS DATE). Отже, щось подібне може працювати:

SELECT * FROM your_table

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

9

Запит за останні тижні:

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

9

Остання або наступна дата, тиждень, місяць та рік. Це може бути корисним для будь-кого.

Поточна дата:

select curdate();

Вчора:

select subdate(curdate(), 1)

Завтра:

select adddate(curdate(), 1)

Останній 1 тиждень:

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

Наступний 1 тиждень:

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

Останній 1 місяць:

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

Наступний 1 місяць:

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

Поточний місяць:

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

Останній 1 рік:

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

Наступний 1 рік:

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

7

Незважаючи на те, що обрана відповідь є правильною і більш короткою, я б аргументував структуру, зазначену в інших відповідях:

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

Якщо вам просто потрібна проста дата без позначки часу, ви також можете написати її наступним чином:

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

Причиною використання CASTversus SUBDATEє CASTсинтаксис ANSI SQL. SUBDATEє специфічною реалізацією MySQL арифметичного компонента дати CAST. Звичка використовувати синтаксис ANSI може зменшити головний біль, якщо вам коли-небудь доведеться перейти до іншої бази даних. Також добре мати таку звичку як професійну практику, оскільки ви майже напевно будете працювати з іншими СУБД у майбутньому.

Жодна з основних систем СУБД не є повністю сумісною з ANSI, але більшість із них реалізують широкий набір синтаксису ANSI, тоді як майже жодна з них поза MySQL та її нащадками (MariaDB, Percona тощо) не буде реалізовувати специфічний для MySQL синтаксис.


Хороші пояснення, чому хтось обирає одне над іншим.
Sablefoste,

4

Я адаптував одну з наведених вище відповідей від cdhowie, оскільки не зміг змусити її працювати. Здається, це працює для мене. Я підозрюю, що це також можливо зробити за допомогою функції 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));
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.