Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Como ordenar por data no MySQL

Problema:


Você deseja classificar as linhas por data.

Exemplo 1:


O exam tabela tem duas colunas, subject e exam_date .
assunto exam_date
Matemática 2019-12-19
Inglês 2020-01-08
Ciência 2020-01-05
Saúde 2020-01-05
Arte NULO

Você deseja classificar as linhas por exam_date .

Solução:

SELECT *
FROM exam
ORDER BY exam_date;

O resultado é assim (as linhas são classificadas em ordem crescente por exam_date ):
assunto exam_date
Arte NULO
Matemática 2019-12-19
Ciência 2020-01-05
Saúde 2020-01-05
Inglês 2020-01-08

Discussão:


Use o ORDER BY palavra-chave e o nome da coluna pela qual você deseja classificar. Dessa forma, você classificará os dados em ordem crescente por esta coluna. Você também pode usar o ASC palavra-chave para deixar claro que a ordem é crescente (a data mais antiga é exibida primeiro, a data mais recente é exibida por último etc.).
SELECT *
FROM exam
ORDER BY exam_date ASC;

Se você quiser ver a data mais recente primeiro e a data mais antiga por último, será necessário classificar em ordem decrescente. Use o DESC palavra-chave neste caso.
SELECT *
FROM exam
ORDER BY exam_date DESC;

Observe que no MySQL, NULL s são exibidos primeiro ao classificar em ordem crescente e por último ao classificar em ordem decrescente. Além disso, as linhas com o mesmo exam_date são exibidos em ordem aleatória (você pode ver Science terceiro e Health quarto, ou Health terceiro e Science quarto).

Exemplo 2:


O exam tabela tem as seguintes colunas:subject , exam_year , exam_month e exam_day . Os meses são dados em nomes, não em números.
assunto exam_year exam_month exam_day
Matemática 2019 Dezembro 19
Inglês 2020 janeiro 8
Ciência 2020 janeiro 5
Saúde 2020 janeiro 5
Arte NULO NULO NULO

Você deseja classificar as linhas por data de exame.

Solução:

SELECT *
FROM exam
ORDER BY STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d');

O resultado é assim (as linhas são classificadas em ordem crescente por exam_year , exam_month e exam_date ):
assunto exam_year exam_month exam_day
Arte NULO NULO NULO
Matemática 2019 Dezembro 19
Saúde 2020 janeiro 5
Ciência 2020 janeiro 5
Inglês 2020 janeiro 8

Discussão:


Para classificar por data, crie valores de data a partir dos valores de ano, mês e dia. Para fazer isso, use a função STR_TO_DATE(). Se você tiver uma data armazenada como uma string no campo 'Year Month Day ', você pode convertê-lo em uma data usando STR_TO_DATE(date_string, '%Y %M %d') . Mas primeiro, você precisa criar uma string usando a função CONCAT():
CONCAT(exam_year, ' ', exam_month, ' ', exam_day)

O CONCAT() A função combina todos os argumentos em uma string. Você não precisa converter números em strings. Como você gostaria de obter uma string no 'Year Month Day ' formato, os argumentos são exam_year , exam_month , exam_day , e os espaços entre eles.

Então, você precisa converter essa string em uma data usando o STR_TO_DATE(date_string, '%Y %M %d') função. O segundo argumento desta função é o formato de data. %Y significa ano, %M significa mês (seu nome completo, não um número) e %d significa dia.
STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d')

Use-o com um ORDER BY cláusula para classificar as linhas em ordem crescente por data. Se você quiser ver as linhas em ordem decrescente, basta anexar um DESC palavra-chave, assim:
SELECT *
FROM exam
ORDER BY STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d') DESC;