Como seleccionar a data da coluna datetime?
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 pergunta como:
SELECT * FROM
data
WHERE datetime = '2009-10-20'
ORDER BY datetime DESC
É a melhor maneira de o fazer?
SELECT * FROM
data
WHERE datetime BETWEEN('2009-10-20 00:00:00' AND '2009-10-20 23:59:59')
ORDER BY datetime DESC
isto devolve, no entanto, um conjunto de resultados vazio. Alguma sugestão?
8 answers
WHERE DATE(datetime) = '2009-10-20'
Ou tentar isto também e ver se funciona em não. Isto ajuda
WHERE datetime LIKE '2009-10-20%'
Tens de verificar onde é que ele não funciona.
Utilizar WHERE DATE(datetime) = '2009-10-20'
tem problemas de desempenho . Como indicado aqui:
- irá calcular
DATE()
para todas as linhas, incluindo aquelas que não coincidem - será impossível usar um índice para a consulta
Utilizar BETWEEN
ou >
, <
, =
operadores que permitem utilizar um índice:
SELECT * FROM data
WHERE datetime BETWEEN '2009-10-20 00:00:00' AND '2009-10-20 23:59:59'
Update: o impacto ao usar LIKE
em vez dos operadores numa coluna indexada é elevado. As alguns resultados de testes estão numa tabela com 1.176.000 linhas:
- usando
datetime LIKE '2009-10-20%'
= > 2931ms - usando
datetime >= '2009-10-20 00:00:00' AND datetime <= '2009-10-20 23:59:59'
= > 168ms
Ao fazer uma segunda chamada sobre a mesma consulta a diferença é ainda maior: 2984ms vs 7ms (sim, apenas 7 milissegundos!). Encontrei isto enquanto reescrevia um código antigo num projecto usando hibernar.
Pode formatar o datetime para a porção Y-M-D:
DATE_FORMAT(datetime, '%Y-%m-%d')
WHERE
(incluindo um cálculo DATE()
), uma vez que esse cálculo deve ser efectuado em todas as linhas do quadro.
A construção BETWEEN ... AND
é inclusiva para ambas as condições de fronteira, exigindo-se que se especifique a sintaxe 23:59:59 na data de fim que ela própria tem outros problemas (transacções microssegundas, que eu acredito que MySQL não apoio em 2009, quando a pergunta foi feita).
A maneira adequada de consultar um campo MySQL timestamp
para um determinado dia é verificar se é maior do que igual para a data desejada, e menos do que para o dia seguinte, sem hora especificada.
WHERE datetime>='2009-10-20' AND datetime<'2009-10-21'
Este é o método mais rápido, de menor memória, de menor recurso intensivo, e adicionalmente suporta todas as funcionalidades do MySQL e casos de canto, como a precisão do sub-segundo tempo. Além disso, é a prova do futuro.
Pode usar:
DATEDIFF ( day , startdate , enddate ) = 0
Ou:
DATEPART( day, startdate ) = DATEPART(day, enddate)
AND
DATEPART( month, startdate ) = DATEPART(month, enddate)
AND
DATEPART( year, startdate ) = DATEPART(year, enddate)
Ou:
CONVERT(DATETIME,CONVERT(VARCHAR(12), startdate, 105)) = CONVERT(DATETIME,CONVERT(VARCHAR(12), enddate, 105))
Aqui estão todos os formatos
Diga que esta é a coluna que contém o valor datetime
, Tabela data
.
+--------------------+
| date_created |
+--------------------+
| 2018-06-02 15:50:30|
+--------------------+
mysql> select DATE(date_created) from data;
+--------------------+
| DATE(date_created) |
+--------------------+
| 2018-06-02 |
+--------------------+
mysql> select YEAR(date_created) from data;
+--------------------+
| YEAR(date_created) |
+--------------------+
| 2018 |
+--------------------+
mysql> select MONTH(date_created) from data;
+---------------------+
| MONTH(date_created) |
+---------------------+
| 6 |
+---------------------+
mysql> select DAY(date_created) from data;
+-------------------+
| DAY(date_created) |
+-------------------+
| 2 |
+-------------------+
mysql> select HOUR(date_created) from data;
+--------------------+
| HOUR(date_created) |
+--------------------+
| 15 |
+--------------------+
mysql> select MINUTE(date_created) from data;
+----------------------+
| MINUTE(date_created) |
+----------------------+
| 50 |
+----------------------+
mysql> select SECOND(date_created) from data;
+----------------------+
| SECOND(date_created) |
+----------------------+
| 31 |
+----------------------+
A melhor e simples maneira de usar a função date
Exemplo
SELECT * FROM
data
WHERE date(datetime) = '2009-10-20'
Ou
SELECT * FROM
data
WHERE date(datetime ) >= '2009-10-20' && date(datetime ) <= '2009-10-20'
Bem, usar o like in statement é a melhor opção onde o datetime como ' 2009-10-20%', deve funcionar neste caso