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;