Problem:
Du vil sortere rækkerne efter dato.
Eksempel 1:
exam
tabellen har to kolonner, subject
og exam_date
.
emne | eksamen_dato |
---|---|
Matematik | 2019-12-19 |
Engelsk | 2020-01-08 |
Videnskab | 2020-01-05 |
Sundhed | 2020-01-05 |
Kunst | NULL |
Du vil sortere rækkerne efter exam_date
.
Løsning:
SELECT * FROM exam ORDER BY exam_date;
Resultatet ser sådan ud (rækkerne er sorteret i stigende rækkefølge efter exam_date
):
emne | eksamen_dato |
---|---|
Kunst | NULL |
Matematik | 2019-12-19 |
Videnskab | 2020-01-05 |
Sundhed | 2020-01-05 |
Engelsk | 2020-01-08 |
Diskussion:
Brug ORDER BY
nøgleord og navnet på den kolonne, som du vil sortere efter. På denne måde vil du sortere dataene i stigende rækkefølge efter denne kolonne. Du kan også bruge ASC
nøgleord for at gøre det klart, at rækkefølgen er stigende (den tidligste dato vises først, den seneste dato vises sidst osv.).
SELECT * FROM exam ORDER BY exam_date ASC;
Hvis du gerne vil se den seneste dato først og den tidligste dato sidst, skal du sortere i faldende rækkefølge. Brug DESC
søgeord i dette tilfælde.
SELECT * FROM exam ORDER BY exam_date DESC;
Bemærk, at i MySQL, NULL
s vises først ved sortering i stigende rækkefølge og sidst ved sortering i faldende rækkefølge. Også rækkerne med den samme exam_date
vises i tilfældig rækkefølge (du kan muligvis se Science
tredje og Health
fjerde eller Health
tredje og Science
fjerde).
Eksempel 2:
exam
tabellen har følgende kolonner:subject
, exam_year
, exam_month
og exam_day
. Månederne er angivet i navne, ikke i tal.
emne | eksamen_år | eksamen_måned | eksamensdag |
---|---|---|---|
Matematik | 2019 | December | 19 |
Engelsk | 2020 | Januar | 8 |
Videnskab | 2020 | Januar | 5 |
Sundhed | 2020 | Januar | 5 |
Kunst | NULL | NULL | NULL |
Du vil sortere rækkerne efter eksamensdato.
Løsning:
SELECT * FROM exam ORDER BY STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d');
Resultatet ser sådan ud (rækkerne er sorteret i stigende rækkefølge efter exam_year
, exam_month
og exam_date
):
emne | eksamen_år | eksamen_måned | eksamensdag |
---|---|---|---|
Kunst | NULL | NULL | NULL |
Matematik | 2019 | December | 19 |
Sundhed | 2020 | Januar | 5 |
Videnskab | 2020 | Januar | 5 |
Engelsk | 2020 | Januar | 8 |
Diskussion:
For at sortere efter dato skal du oprette datoværdier fra år, måned og dagværdier. For at gøre dette skal du bruge STR_TO_DATE()-funktionen. Hvis du har en dato gemt som en streng i 'Year Month Day
' format, kan du caste det til en dato ved hjælp af STR_TO_DATE(date_string, '%Y %M %d')
. Men først skal du oprette en streng ved hjælp af CONCAT()-funktionen:
CONCAT(exam_year, ' ', exam_month, ' ', exam_day)
CONCAT()
funktion kombinerer alle argumenterne i én streng. Du behøver ikke at kaste tal til strenge. Da du gerne vil have en streng i 'Year Month Day
' format, er argumenterne exam_year
, exam_month
, exam_day
, og mellemrummene mellem dem.
Derefter skal du konvertere denne streng til en dato ved hjælp af STR_TO_DATE(date_string, '%Y %M %d')
fungere. Det andet argument for denne funktion er datoformatet. %Y
står for år, %M
står for måned (dets fulde navn, ikke et tal) og %d
står for dag.
STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d')
Brug den med en ORDER BY
klausul for at sortere rækkerne i stigende rækkefølge efter dato. Hvis du gerne vil se rækkerne i faldende rækkefølge, skal du blot tilføje en DESC
søgeord som dette:
SELECT * FROM exam ORDER BY STR_TO_DATE(CONCAT(exam_year, ' ', exam_month, ' ', exam_day), '%Y %M %d') DESC;