MySQL selecionando a data de ontem

101

Como posso exibir e contar os valores cujas datas são ontem? Eu costumava time()inserir a data no banco de dados. Exemplo:

URL: google.com youtube.com google.com youtube.com test.com youtube.com
DateVisited: 1313668492 1313668540 1313668571 13154314

Desejo exibir quantos URLs que possuem múltiplos existiam na tabela e também quantos desses URLs foram visitados ontem. Resultado de exemplo:

LINK       | timesExisted | timesVisitedYesterday
Google.com |       2      | 2
youtube.com|       3      | 3

Já tenho a ideia de pegar a data de ontem, mas não tenho ideia de contar quantas vezes existiu um URL para ontem e quantas vezes existiu um URL na tabela.

PinoyStackOverflower
fonte

Respostas:

166

A maneira mais simples e melhor de obter a data de ontem é:

subdate(current_date, 1)

Sua consulta seria:

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

Para os curiosos, o motivo que sum(condition)fornece a contagem de linhas que satisfazem a condição, que de outra forma exigiria uma casedeclaração incômoda e prolixa , é que no mysql os valores booleanos são 1verdadeiros e 0falsos, portanto, somar uma condição conta efetivamente quantas vezes é verdade. Usar esse padrão pode aprimorar seu código SQL.

Boêmio
fonte
89
SELECT SUBDATE(NOW(),1);

onde a função now () retorna a data e hora atuais do sistema em Timestamp ...

você pode usar:

SELECT SUBDATE(CURDATE(),1)
Romancha KC
fonte
3
Funcionou para mim. Muito obrigado
mable george
20

Você pode usar:

SELECT SUBDATE(NOW(), 1);

ou

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

ou

SELECT NOW() - INTERVAL 1 DAY;

ou

SELECT DATE_SUB(NOW(), INTERVAL 1 DAY);
simhumileco
fonte
11

Você pode obter a data de ontem usando a expressão CAST(NOW() - INTERVAL 1 DAY AS DATE). Então, algo assim pode funcionar:

SELECT * FROM your_table

WHERE DateVisited >= UNIX_TIMESTAMP(CAST(NOW() - INTERVAL 1 DAY AS DATE))
  AND DateVisited <= UNIX_TIMESTAMP(CAST(NOW() AS DATE));
Cdhowie
fonte
9

Consulta das últimas semanas:

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

Cálculo da última ou próxima data, semana, mês e ano. Pode ser útil para qualquer pessoa.

Data atual:

select curdate();

Ontem:

select subdate(curdate(), 1)

Amanhã:

select adddate(curdate(), 1)

Última 1 semana:

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

Próxima semana:

between adddate(curdate(), 7) and adddate(curdate(), 1)

Último 1 mês:

between subdate(curdate(), 30) and subdate(curdate(), 1)

Próximo mês:

between adddate(curdate(), 30) and adddate(curdate(), 1)

Mês atual:

subdate(curdate(),day(curdate())-1) and last_day(curdate());

Último 1 ano:

between subdate(curdate(), 365) and subdate(curdate(), 1)

Próximo 1 ano:

between adddate(curdate(), 365) and adddate(curdate(), 1)
Atequer Rahman
fonte
7

Embora a resposta escolhida seja correta e mais concisa, eu defenderia a estrutura observada em outras respostas:

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

Se você só precisa de uma data simples sem carimbo de data / hora, também pode escrevê-la da seguinte forma:

SELECT * FROM your_table
WHERE DateVisited >= CAST(NOW() - INTERVAL 1 DAY AS DATE)
  AND DateVisited <= CAST(NOW() AS DATE);

A razão para usar CASTversus SUBDATEé a CASTsintaxe ANSI SQL. SUBDATEé uma implementação específica do MySQL do componente aritmético de datas de CAST. Adquirir o hábito de usar a sintaxe ANSI pode reduzir as dores de cabeça, caso você precise migrar para um banco de dados diferente. Também é bom ter o hábito como prática profissional, pois é quase certo que você trabalhará com outros SGBDs no futuro.

Nenhum dos principais sistemas DBMS é totalmente compatível com ANSI, mas a maioria deles implementa o amplo conjunto de sintaxe ANSI, enquanto quase nenhum deles fora do MySQL e seus descendentes (MariaDB, Percona, etc) implementará a sintaxe específica do MySQL.

trclark81
fonte
Boas explicações sobre por que um escolheria um em vez do outro.
Sablefoste
4

Eu adaptei uma das respostas acima do cdhowie porque não consegui fazê-la funcionar. Isso parece funcionar para mim. Suspeito que também seja possível fazer isso com a função UNIX_TIMESTAMP usada.

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));
John-Paul Stanford
fonte