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;