Выбор MySQL вчера

Как я могу отображать и подсчитывать значения, чьи даты вчера? Я использовал 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-адрес существовал в таблице.

Ответ 1

Самый простой и лучший способ получить вчерашнюю дату:

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 значения boolean 1 для true и 0 для false, поэтому суммирование состояния эффективно подсчитывает, сколько раз это верно. Использование этого шаблона может помочь вашему SQL-коду.

Ответ 2

SELECT SUBDATE(NOW(),1);

где функция now() возвращает текущую дату и время системы в Timestamp...

вы можете использовать:

SELECT SUBDATE(CURDATE(),1)

Ответ 3

Вы можете получить вчерашнюю дату, используя выражение 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));

Ответ 4

Запрос за последние недели:

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

Ответ 5

Вы можете использовать:

SELECT SUBDATE(NOW(), 1);

или

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

или

SELECT NOW() - INTERVAL 1 DAY;

или

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

Ответ 6

Я адаптировал один из вышеупомянутых ответов 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));

Ответ 7

В то время как выбранный ответ правильный и более краткий, я бы сказал, что структура была отмечена в других ответах:

SELECT * FROM your_table WHERE UNIX_TIMESTAMP (DateVisited) >= UNIX_TIMESTAMP (CAST (NOW() - INTERVAL 1 DAY AS DATE)) И 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);

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

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