Problema:
Você deseja classificar as linhas por data.
Exemplo 1:
O
exam
tabela tem duas colunas, subject
e exam_date
. Assunto | Data do exame |
---|---|
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 ExamDate;
O resultado é assim (as linhas são classificadas em ordem crescente por
ExamDate
):Assunto | Data do exame |
---|---|
Arte | NULO |
Ciência | 2020-01-05 |
Saúde | 2020-01-05 |
Inglês | 2020-01-08 |
Matemática | 2019-12-19 |
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 ExamDate 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 ExamDate DESC;
Observe que em T-SQL,
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 a mesma ExamDate
são exibidos em ordem não determinística (você pode ver Science
segundo e Health
terceiro, ou Health
segundo e Science
terceiro). Exemplo 2:
O
exam
tabela tem as seguintes colunas:subject
, exam_year
, exam_month
e exam_day
. O mês é dado pelo nome, não pelo número. Assunto | Ano do exame | ExamMonth | ExamDay |
---|---|---|---|
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 CAST( CAST(ExamYear AS VARCHAR(4)) + '-' + ExamMonth + '-' + CAST(ExamDay AS VARCHAR(2)) AS DATE);
O resultado é assim (as linhas são classificadas em ordem crescente por
ExamYear
, ExamMonth
e ExamDate
):Assunto | Ano do exame | ExamMonth | ExamDay |
---|---|---|---|
Arte | NULO | NULO | NULO |
Saúde | 2020 | janeiro | 5 |
Ciência | 2020 | janeiro | 5 |
Inglês | 2020 | janeiro | 8 |
Matemática | 2019 | Dezembro | 19 |
Discussão:
Para agrupar por data, crie valores de data a partir dos valores de ano, mês e dia. Para fazer isso, use a função CAST(). Se você tiver uma data armazenada como uma string no '
YYYY-Month-DD
', você pode convertê-lo em uma data usando CAST(date_string AS date)
. Primeiro, você precisa criar uma string, também usando a função CAST():CAST(ExamYear AS VARCHAR(4)) + '-' + ExamMonth + '-' + CAST(ExamDay AS VARCHAR(2))
A expressão
CAST(ExamYear AS VARCHAR(4))
cria uma string a partir do número armazenado em ExamYear
. A expressão CAST(ExamDay AS VARCHAR(2))
cria uma string a partir do número armazenado em ExamDay
. ExamMonth
já é uma string, então não há necessidade de convertê-la. Então, você precisa converter essa string para uma data usando o
CAST(date_string AS date)
função:CAST( CAST(ExamYear AS VARCHAR(4)) + '-' + ExamMonth + '-' + CAST(ExamDay AS VARCHAR(2)) AS DATE)
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 CAST( CAST(ExamYear AS VARCHAR(4)) + '-' + ExamMonth + '-' + CAST(ExamDay AS VARCHAR(2)) AS DATE) DESC;