Eu tenho uma coluna do tipo "datetime" com valores como 2009-10-20 10:00:00
Gostaria de extrair a data do datetime e escrever uma consulta como:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
A seguinte é a melhor maneira de fazer isso?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
No entanto, isso retorna um conjunto de resultados vazio. Alguma sugestão?
O uso
WHERE DATE(datetime) = '2009-10-20'
tem problemas de desempenho . Como indicado aqui :DATE()
para todas as linhas, incluindo aquelas que não correspondem.Use
BETWEEN
ou>
,<
,=
operadores, que permitem a utilização de um índice de:Atualização: o impacto no uso em
LIKE
vez de operadores em uma coluna indexada é alto . Estes são alguns resultados de teste em uma tabela com 1.176.000 linhas:datetime LIKE '2009-10-20%'
=> 2931msdatetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
=> 168msAo fazer uma segunda chamada na mesma consulta, a diferença é ainda maior: 2984ms vs 7ms (sim, apenas 7 milissegundos!). Encontrei isso ao reescrever algum código antigo em um projeto usando o Hibernate.
fonte
DATE(datetime)
paraBETWEEN AND
acompanhar as cenas, obteremos uma breve declaração e um desempenho interessante. Por que não? Por que eles não fizeram isso? :)DATE(datetime) in (:list)
não funciona comBETWEEN
Você pode formatar o datetime para a parte YMD:
fonte
DATE_FORMAT(datetime, '%H:%i:%S')
Embora todas as respostas na página retornem o resultado desejado, todas elas apresentam problemas de desempenho. Nunca execute cálculos nos campos da
WHERE
cláusula (incluindo umDATE()
cálculo), pois esse cálculo deve ser executado em todas as linhas da tabela.A
BETWEEN ... AND
construção é inclusiva para ambas as condições de borda, exigindo que se especifique a sintaxe 23:59:59 na data final, a qual possui outros problemas (transações de microssegundos, que acredito que o MySQL não deu suporte em 2009 quando a pergunta foi feita).A maneira correta de consultar um
timestamp
campo MySQL para um dia específico é verificar Maior que Igual à data desejada e Menor que para o dia seguinte, sem hora especificada.Este é o método de mais rápido desempenho, com menos memória e menos recursos, além de suportar todos os recursos e casos de canto do MySQL, como precisão de carimbo de data / hora de sub-segundo. Além disso, é uma prova futura.
fonte
Aqui estão todos os formatos
Digamos que esta seja a coluna que contém o
datetime
valor, tabeladata
.fonte
Você pode usar:
Ou:
Ou:
fonte
maneira simples e melhor de usar a função de data
exemplo
OU
fonte
Bem, usar
LIKE
na declaração é a melhor opçãoWHERE datetime LIKE '2009-10-20%'
que deve funcionar nesse casofonte