Database
 sql >> Database >  >> RDS >> Database

Come ordinare per data in T-SQL

Problema:

Vuoi ordinare le righe per data.

Esempio 1:

L'exam la tabella ha due colonne, subject e exam_date .

Soggetto Data dell'esame
Matematica 19-12-2019
Inglese 08-01-2020
Scienza 05-01-2020
Salute 05-01-2020
Arte NULLO

Vuoi ordinare le righe per exam_date .

Soluzione:

SELECT *
FROM Exam
ORDER BY ExamDate;

Il risultato è simile a questo (le righe sono ordinate in ordine crescente per ExamDate ):

Soggetto Data dell'esame
Arte NULLO
Scienza 05-01-2020
Salute 05-01-2020
Inglese 08-01-2020
Matematica 19-12-2019

Discussione:

Usa il ORDER BY parola chiave e il nome della colonna in base alla quale si desidera eseguire l'ordinamento. In questo modo, ordinerai i dati in ordine crescente in base a questa colonna. Puoi anche usare l'ASC parola chiave per chiarire che l'ordine è crescente (la prima data viene mostrata per prima, l'ultima data viene mostrata per ultima, ecc.).

SELECT *
FROM Exam
ORDER BY ExamDate ASC;

Se desideri visualizzare prima la data più recente e quella più recente per ultima, è necessario ordinare in ordine decrescente. Usa il DESC parola chiave in questo caso.

SELECT *
FROM Exam
ORDER BY ExamDate DESC;

Nota che in T-SQL, NULL I messaggi vengono visualizzati per primi quando si ordina in ordine crescente e per ultimi quando si ordina in ordine decrescente. Inoltre, le righe con lo stesso ExamDate sono visualizzati in ordine non deterministico (potresti vedere Science secondo e Health terzo, o Health secondo e Science terzo).

Esempio 2:

L'exam tabella ha le seguenti colonne:subject , exam_year , exam_month e exam_day . Il mese è indicato per nome, non per numero.

Soggetto Anno d'esame Mese dell'Esame Giorno degli esami
Matematica 2019 Dicembre 19
Inglese 2020 gennaio 8
Scienza 2020 gennaio 5
Salute 2020 gennaio 5
Arte NULLO NULLO NULLO

Vuoi ordinare le righe in base alla data dell'esame.

Soluzione:

SELECT *
FROM Exam
ORDER BY CAST(
  CAST(ExamYear AS VARCHAR(4))
  + '-'
  + ExamMonth
  + '-'
  + CAST(ExamDay AS VARCHAR(2))
AS DATE);

Il risultato è simile a questo (le righe sono ordinate in ordine crescente per ExamYear , ExamMonth e ExamDate ):

Soggetto Anno d'esame Mese dell'Esame Giorno degli esami
Arte NULLO NULLO NULLO
Salute 2020 gennaio 5
Scienza 2020 gennaio 5
Inglese 2020 gennaio 8
Matematica 2019 Dicembre 19

Discussione:

Per raggruppare per data, creare valori di data dai valori di anno, mese e giorno. A tale scopo, utilizzare la funzione CAST(). Se hai una data memorizzata come stringa nel 'YYYY-Month-DD ', puoi trasmetterlo a una data usando CAST(date_string AS date) . Per prima cosa devi creare una stringa, usando anche la funzione CAST():

CAST(ExamYear AS VARCHAR(4))
+ '-'
+ ExamMonth
+ '-'
+ CAST(ExamDay AS VARCHAR(2))

L'espressione CAST(ExamYear AS VARCHAR(4)) crea una stringa dal numero memorizzato in ExamYear . L'espressione CAST(ExamDay AS VARCHAR(2)) crea una stringa dal numero memorizzato in ExamDay . ExamMonth è già una stringa, quindi non è necessario eseguirne il cast.

Quindi, devi trasmettere questa stringa a una data utilizzando CAST(date_string AS date) funzione:

CAST(
  CAST(ExamYear AS VARCHAR(4))
  + '-'
  + ExamMonth
  + '-'
  + CAST(ExamDay AS VARCHAR(2))
AS DATE)

Usalo con un ORDER BY clausola per ordinare le righe in ordine crescente per data. Se desideri visualizzare le righe in ordine decrescente, aggiungi semplicemente un DESC parola chiave, come questa:

SELECT *
FROM Exam
ORDER BY CAST(
  CAST(ExamYear AS VARCHAR(4))
  + '-'
  + ExamMonth
  + '-'
  + CAST(ExamDay AS VARCHAR(2))
AS DATE) DESC;