В 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-адрес существовал в таблице.
7 ответов:
самый простой и лучший способ получить вчерашнюю дату:
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для настоящих и0для false, поэтому суммирование условия эффективно подсчитывает, сколько раз это правда. Используя этот шаблон может приведите в порядок свой SQL-код.
SELECT SUBDATE(NOW(),1);где теперь () функция возвращает текущую дату и время системы в метке времени...
вы можете использовать:
SELECT SUBDATE(CURDATE(),1)
Вы можете получить вчерашнюю дату с помощью выражения
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));
вы можете использовать:
SELECT SUBDATE(NOW(), 1);или
SELECT SUBDATE(NOW(), INTERVAL 1 DAY);или
SELECT NOW() - INTERVAL 1 DAY;или
SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
запрос за последние недели:
SELECT * FROM dual WHERE search_date BETWEEN SUBDATE(CURDATE(), 7) AND CURDATE()
я адаптировал один из приведенных выше ответов от 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));
хотя выбранный ответ является правильным и более кратким, я бы поспорил о структуре, отмеченной в других ответах:
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иSUBDATE- этоCAST- это синтаксис ANSI SQL.SUBDATEявляется конкретной реализацией MySQL арифметического компонента датыCAST. Привыкание к использованию синтаксиса ANSI может уменьшить головные боли если вам когда-нибудь придется перейти на другую базу данных. Также хорошо быть в привычке как профессиональная практика, так как вы почти наверняка будете работать с другими СУБД в будущем.ни одна из основных систем СУБД не полностью совместима с ANSI, но большинство из них реализуют широкий набор синтаксиса ANSI, тогда как почти никто из них за пределами MySQL и его потомков (MariaDB, Percona и т. д.) не будет реализовывать синтаксис, специфичный для MySQL.
Comments