В 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-адрес существовал в таблице.

734   7  

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

    Ничего не найдено.