Problem:
Du vill sortera raderna efter datum.
Exempel 1:
exam
Tabellen har två kolumner, subject
och exam_date
.
ämne | exam_date |
---|---|
Matematik | 2019-12-19 |
Engelska | 2020-01-08 |
Vetenskap | 2020-01-05 |
Hälsa | 2020-01-05 |
Konst | NULL |
Du vill sortera raderna efter exam_date
.
Lösning:
SELECT * FROM exam ORDER BY exam_date;
Resultatet ser ut så här (raderna är sorterade i stigande ordning efter exam_date
):
ämne | exam_date |
---|---|
Matematik | 2019-12-19 |
Vetenskap | 2020-01-05 |
Hälsa | 2020-01-05 |
Engelska | 2020-01-08 |
Konst | NULL |
Diskussion:
Använd ORDER BY
nyckelord och namnet på den kolumn som du vill sortera efter. På så sätt kommer du att sortera data i stigande ordning efter den här kolumnen. Du kan också använda ASC
nyckelord för att göra det tydligt att ordningen stiger (det tidigaste datumet visas först, det senaste datumet visas sist, etc.).
SELECT * FROM exam ORDER BY exam_date ASC;
Om du vill se det senaste datumet först och det tidigaste datumet sist måste du sortera i fallande ordning. Använd DESC
nyckelord i det här fallet.
SELECT * FROM exam ORDER BY exam_date DESC;
Observera att i PostgreSQL och i Oracle, NULL
s visas sist vid sortering i stigande ordning och först vid sortering i fallande ordning. Dessutom raderna med samma exam_date
visas i slumpmässig ordning (du kan se Science
andra och Health
tredje, eller hälsa andra och Science
tredje).
Exempel 2:
exam
Tabellen har följande kolumner:subject
, exam_year
, exam_month
och exam_day
. Månaderna anges i namn, inte i siffror.
ämne | examensår | exam_month | exam_day |
---|---|---|---|
Matematik | 2019 | December | 19 |
Engelska | 2020 | Januari | 8 |
Vetenskap | 2020 | Januari | 5 |
Hälsa | 2020 | Januari | 5 |
Konst | NULL | NULL | NULL |
Du vill sortera raderna efter examensdatum.
Lösning:
SELECT * FROM exam ORDER BY exam_year, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')), exam_day;
Resultatet ser ut så här (raderna är sorterade i stigande ordning efter exam_year
, exam_month
och exam_date
):
ämne | examensår | exam_month | exam_day |
---|---|---|---|
Matematik | 2019 | December | 19 |
Hälsa | 2020 | Januari | 5 |
Vetenskap | 2020 | Januari | 5 |
Engelska | 2020 | Januari | 8 |
Konst | NULL | NULL | NULL |
Diskussion:
Du måste ordna raderna efter tre värden:året, månaden och dagen, men för att ha rätt ordning 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(exam_month, 'Month') konverterar hela månadens namn 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 returneras som ett nummer.
Genom att kombinera dessa två funktioner kan du få månaden som ett tal med följande formel:
EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month'))
För att sortera raderna efter datum måste du sortera efter år, månad och dag (i denna ordning). Om du vill se det senaste provet först måste du sortera i fallande ordning. För att göra detta måste du använda en DESC
nyckelord efter varje kolumn i ORDER BY
klausul.
SELECT * FROM exam ORDER BY exam_year DESC, EXTRACT(MONTH FROM TO_DATE(exam_month, 'Month')) DESC, exam_day DESC;