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;