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

Come ordinare per nome del mese in PostgreSQL o Oracle

Problema:

Vuoi ordinare le righe in base al numero del mese, dati i nomi dei mesi (vuoi che gennaio venga mostrato per primo, dicembre per ultimo).

Esempio:

Il birthday la tabella contiene due colonne:nome e birthday_month . I mesi sono indicati in nomi, non in numeri.

nome mese_compleanno
Ronan Tisha NULLO
Dicembre gennaio
Angie Julia Aprile
Narelle Dillan Aprile
Purdie Casey gennaio
Donna Nell NULLO
Blaze Graeme ottobre

Vuoi ordinare le righe per birthday_month .

Soluzione:

SELECT *
FROM birthday
ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));

Il risultato è simile al seguente (le righe sono ordinate in ordine crescente per birthday_month ):

nome mese_compleanno
Purdie Casey gennaio
Angie Julia Aprile
Narelle Dillan Aprile
Blaze Graeme ottobre
Ronan Tisha gennaio
Dicembre NULLO
Donna Nell NULLO

Discussione:

Per ordinare le righe per mese a partire da gennaio e termina con dicembre, devi convertire il mese in un numero ('January ' a 1, 'February ' a 2 , eccetera.). Altrimenti, vedrai 'December ' prima di 'January '. La funzione TO_DATE(birthday_month, 'Mese') converte il nome di un mese intero 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 sarà un numero compreso tra 1 e 12 .

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

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

Inserisci questa espressione dopo ORDER BY per ordinare le righe per mese. Se desideri visualizzare prima l'ultimo mese, dovrai ordinare in ordine decrescente. Per fare ciò, devi usare un DESC parola chiave, come questa:

SELECT *
FROM birthday
ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;

Nota che in PostgreSQL e 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 birthday_month vengono visualizzati in ordine casuale (potresti vedere Angie Julia secondo e Narelle Dillan terzo, o Narelle Dillan secondo e Angie Julia terzo).