MySQL выбирает вчерашнюю дату

102

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

ПинойСтак
источник

Ответы:

167

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

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

Богемный
источник
91
SELECT SUBDATE(NOW(),1);

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

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

SELECT SUBDATE(CURDATE(),1)
Romancha KC
источник
3
Работал у меня. Большое спасибо
Мейбл Джордж
21

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

SELECT SUBDATE(NOW(), 1);

или

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

или

SELECT NOW() - INTERVAL 1 DAY;

или

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
simhumileco
источник
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));
cdhowie
источник
9

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

SELECT *
FROM dual
WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()
NCrash
источник
9

Расчет последней или следующей даты, недели, месяца и года. Это может быть полезно для всех.

Текущая дата:

select curdate();

Вчерашний день:

select subdate(curdate(), 1)

Завтра:

select adddate(curdate(), 1)

За последнюю неделю:

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

Следующая неделя:

between adddate(curdate(), 7) and adddate(curdate(), 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());

Последний год:

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

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

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

trclark81
источник
Хорошие объяснения того, почему следует выбирать одно из них.
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));
Джон-Пол Стэнфорд
источник