Problem:
Du vill sortera raderna efter månadsnummer, givna månadsnamn (du vill att januari ska visas först, december sista).
Exempel:
birthday Tabellen innehåller två kolumner:namn och birthday_month . Månaderna anges i namn, inte i siffror.
| namn | födelsedag_månad |
|---|---|
| Ronan Tisha | NULL |
| December | Januari |
| Angie Julia | April |
| Narelle Dillan | April |
| Purdie Casey | Januari |
| Donna Nell | NULL |
| Blaze Graeme | Oktober |
Du vill sortera raderna efter birthday_month .
Lösning:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'));
Resultatet ser ut så här (raderna är sorterade i stigande ordning efter birthday_month ):
| namn | födelsedag_månad |
|---|---|
| Purdie Casey | Januari |
| Angie Julia | April |
| Narelle Dillan | April |
| Blaze Graeme | Oktober |
| Ronan Tisha | Januari |
| December | NULL |
| Donna Nell | NULL |
Diskussion:
För att sortera raderna efter månad med början från januari och slutar med december, måste du konvertera månaden till ett tal ('January ' till 1, 'February ' till 2 , etc.). Annars skulle du se 'December ' före 'January '. Funktionen TO_DATE(birthday_month, 'Month') konverterar ett fullständigt månadsnamn till ett datum i '0001-MM-01 ' format. Till exempel får du '0001-12-01 ' för december.
Du kan nu använda EXTRACT(MONTH FROM date)-funktionen för att extrahera månaden från detta datumvärde. Månaden kommer att vara ett nummer mellan 1 och 12 .
Genom att kombinera dessa två funktioner kan du få månaden som ett tal med följande formel:
EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month'))
Sätt detta uttryck efter ORDER BY för att sortera raderna efter månad. Om du vill se den senaste månaden först, måste du sortera i fallande ordning. För att göra detta måste du använda en DESC nyckelord, så här:
SELECT * FROM birthday ORDER BY EXTRACT(MONTH FROM TO_DATE(birthday_month, 'Month')) DESC;
Observera att i PostgreSQL och Oracle, NULL s visas sist vid sortering i stigande ordning och först vid sortering i fallande ordning. Dessutom raderna med samma birthday_month visas i slumpmässig ordning (du kan se Angie Julia andra och Narelle Dillan tredje, eller Narelle Dillan andra och Angie Julia tredje).