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?

Author: Aris, 2009-11-18

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.

 335
Author: Priyank Bolia, 2013-04-29 12:37:56

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.

 67
Author: IvanRF, 2017-05-23 10:31:36

Pode formatar o datetime para a porção Y-M-D:

DATE_FORMAT(datetime, '%Y-%m-%d')
 20
Author: Prusprus, 2014-01-02 17:59:02
Apesar de todas as respostas na página devolverem o resultado desejado, todos eles têm problemas de desempenho. nunca efectuar cálculos sobre campos na Cláusula 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.

 9
Author: dotancohen, 2017-04-16 09:41:01

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))
 3
Author: Michel van Engelen, 2012-02-12 14:55:32

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 |
+----------------------+
 3
Author: Siraj, 2018-06-02 10:38:58

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'
 2
Author: Raja Rama Mohan Thavalam, 2015-03-10 05:55:26

Bem, usar o like in statement é a melhor opção onde o datetime como ' 2009-10-20%', deve funcionar neste caso

 -1
Author: imran, 2013-07-22 11:16:40