Database
 sql >> Base de Dados >  >> RDS >> Database

Como ordenar por data no T-SQL

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;