Выбор 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.