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;