Estou tentando selecionar apenas os registros de hoje de uma tabela de banco de dados.
Atualmente eu uso
SELECT * FROM `table` WHERE (`timestamp` > DATE_SUB(now(), INTERVAL 1 DAY));
Mas isso leva os resultados das últimas 24 horas, e preciso selecionar apenas os resultados de hoje, ignorando o tempo. Como posso selecionar os resultados apenas com base na data?
Using where; Using index
?timestamp
(edate
como no meu caso) é uma palavra reservada do MySQLSe você quiser que um índice seja usado e a consulta não faça uma verificação de tabela:
Para mostrar a diferença que isso faz nos planos de execução reais, testaremos com um SQL-Fiddle (um site extremamente útil):
Vamos experimentar as 2 versões agora.
Versão 1 com
DATE(timestamp) = ?
Explicar:
Ele filtra todas as (6671) linhas e, em seguida, faz uma classificação de arquivos (isso não é um problema, pois as linhas retornadas são poucas)
Versão 2 com
timestamp <= ? AND timestamp < ?
Explicar:
Ele usa uma varredura de intervalo no índice e, em seguida, lê apenas as linhas correspondentes da tabela.
fonte
INDEX t_IX (timestamp, id)
poderia (deveria?) apenas serINDEX t_IX (timestamp)
, já que a chave primária está implícita no índice. ou há uma razão que eu não entendo para fazer isso? Eu tentei no sql-fiddle e vi o mesmo (melhor) plano de execuçãoid
(porque é o PK e, portanto, o índice agrupado da tabela) é anexado ao índice de qualquer maneira. Portanto, não custa nada adicioná-lo explicitamente (e pode pegar alguns pontos cegos do otimizador). Certamente não é relevante neste caso / consulta.timestamp < CURDATE() + INTERVAL 1 DAY
é necessário?é mais curto, não há necessidade de usar 'AND timestamp <CURDATE () + INTERVAL 1 DAY'
porque CURDATE () sempre retorna o dia atual
Função CURDATE () do MySQL
fonte
De quantas maneiras podemos tirar a pele desse gato? Aqui está mais uma variante.
SELECT * FROM
table
WHERE DATE (FROM_UNIXTIME (timestamp
)) = '2015-11-18';fonte
Se você quiser comparar com uma data específica, pode escrever diretamente como:
// aqui o timestamp é o nome da coluna tendo o tipo como timestamp
ou
Para buscar a data de hoje, a função CURDATE () está disponível, então:
fonte
Basta lançá-lo em uma data:
fonte
Isso poderia ser o mais fácil na minha opinião:
fonte
Ou você pode usar a alternativa CURRENT_DATE, com o mesmo resultado:
Exemplos de database.guide
fonte
No Visual Studio 2017, usando o banco de dados integrado para desenvolvimento, tive problemas com a solução fornecida atual, tive que alterar o código para fazê-lo funcionar porque gerou o erro de que DATE () não era uma função integrada.
Aqui está minha solução:
where CAST(TimeCalled AS DATE) = CAST(GETDATE() AS DATE)
fonte