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 |
---|---|
Konst | NULL |
Matematik | 2019-12-19 |
Vetenskap | 2020-01-05 |
Hälsa | 2020-01-05 |
Engelska | 2020-01-08 |
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 MySQL, NULL
s visas först vid sortering i stigande ordning och sist vid sortering i fallande ordning. Dessutom raderna med samma exam_date
visas i slumpmässig ordning (du kan se Science
tredje och Health
fjärde, eller Health
tredje och Science
fjärde).
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 undersökningsdatum.
Lösning:
SELECT * FROM exam ORDER BY STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d');
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 |
---|---|---|---|
Konst | NULL | NULL | NULL |
Matematik | 2019 | December | 19 |
Hälsa | 2020 | Januari | 5 |
Vetenskap | 2020 | Januari | 5 |
Engelska | 2020 | Januari | 8 |
Diskussion:
För att sortera efter datum, skapa datumvärden från år, månad och dagvärden. För att göra detta, använd STR_TO_DATE()-funktionen. Om du har ett datum lagrat som en sträng i 'Year Month Day
' format, kan du casta det till ett datum med STR_TO_DATE(date_string, '%Y %M %d')
. Men först måste du skapa en sträng med CONCAT()-funktionen:
CONCAT(exam_year, ' ', exam_month, ' ', exam_day)
CONCAT()
funktion kombinerar alla argument till en sträng. Du behöver inte kasta nummer till strängar. Eftersom du vill få en sträng i 'Year Month Day
' format, är argumenten exam_year
, exam_month
, exam_day
, och mellanrummen mellan dem.
Sedan måste du konvertera denna sträng till ett datum med STR_TO_DATE(date_string, '%Y %M %d')
fungera. Det andra argumentet för denna funktion är datumformatet. %Y
står för år, %M
står för månad (dess fullständiga namn, inte ett nummer), och %d
står för dag.
STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d')
Använd den med en ORDER BY
sats för att sortera raderna i stigande ordning efter datum. Om du vill se raderna i fallande ordning, lägg bara till en DESC
nyckelord, så här:
SELECT * FROM exam ORDER BY STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d') DESC;