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

Come ordinare per data in PostgreSQL o Oracle

Problema:

Vuoi ordinare le righe per data.

Esempio 1:

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

soggetto data_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 exam_date;

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

soggetto data_esame
Matematica 19-12-2019
Scienza 05-01-2020
Salute 05-01-2020
Inglese 08-01-2020
Arte NULLO

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 exam_date 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 exam_date DESC;

Nota che in PostgreSQL e in Oracle, NULL I messaggi vengono visualizzati per ultimi quando si ordina in ordine crescente e per primi quando si ordina in ordine decrescente. Inoltre, le righe con lo stesso exam_date vengono visualizzati in ordine casuale (potresti vedere Science secondo e Health terzo, o Salute secondo e Science terzo).

Esempio 2:

L'exam tabella ha le seguenti colonne:subject , exam_year , exam_month e exam_day . I mesi sono indicati in nomi, non in numeri.

soggetto anno_esame mese_esame giorno_esame
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
  exam_year,
  EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')),
  exam_day;

Il risultato è simile a questo (le righe sono ordinate in ordine crescente per exam_year , exam_month e exam_date ):

soggetto anno_esame mese_esame giorno_esame
Matematica 2019 Dicembre 19
Salute 2020 gennaio 5
Scienza 2020 gennaio 5
Inglese 2020 gennaio 8
Arte NULLO NULLO NULLO

Discussione:

Devi ordinare le righe in base a tre valori:l'anno, il mese e il giorno, ma per avere l'ordine corretto, devi convertire il mese in un numero ('January ' a 1 , 'February ' a 2 , eccetera.). Altrimenti, vedrai 'December ' prima di 'January '. La funzione TO_DATE(mese_esame, 'Mese') converte il nome completo del mese in una data in '0001-MM-01 ' formato. Ad esempio, ottieni '0001-12-01 ' per dicembre.

È ora possibile utilizzare la funzione EXTRACT(MESE DA data) per estrarre il mese da questo valore di data. Il mese verrà restituito come numero.

Combinando queste due funzioni, puoi ottenere il mese come numero utilizzando la seguente formula:

EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month'))

Per ordinare le righe per data, è necessario ordinare per anno, mese e giorno (in questo ordine). Se desideri vedere prima l'ultimo esame, dovrai ordinarlo in ordine decrescente. Per fare ciò, devi usare un DESC parola chiave dopo ogni colonna in ORDER BY clausola.

SELECT *
FROM exam
ORDER BY
  exam_year DESC,
  EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')) DESC,
  exam_day DESC;