Problem:
Chcesz posortować wiersze według numeru miesiąca, podanych nazw miesięcy (chcesz, aby styczeń był wyświetlany jako pierwszy, grudzień jako ostatni).
Przykład:
birthday tabela zawiera dwie kolumny:imię i nazwisko oraz birthday_month . Miesiące podane są w imionach, a nie w liczbach.p>
| name | birthday_month |
|---|---|
| Ronan Tisha | NULL |
| Grudzień | 2020 |
| Angie Julia | Kwiecień |
| Narelle Dillan | Kwiecień |
| Purdie Casey | Styczeń |
| Donna Nell | NULL |
| Blaze Graeme | październik |
Chcesz posortować wiersze według birthday_month .
Rozwiązanie:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d');
Wynik wygląda tak:
| nazwa | birthday_month |
|---|---|
| Donna Nell | NULL |
| Purdie Casey | Styczeń |
| Angie Julia | Kwiecień |
| Narelle Dillan | Kwiecień |
| Blaze Graeme | październik |
| Ronan Tisza | NULL |
| Grudzień | październik |
Dyskusja:
Aby zamówić według miesiąca, utwórz datę z tym miesiącem. Aby to zrobić, użyj funkcji STR_TO_DATE(). Jeśli masz datę zapisaną jako ciąg w 'Year Month Day ', możesz rzutować go na datę za pomocą STR_TO_DATE(date_string, '%Y %M %d') .
Najpierw musisz utworzyć ciąg znaków za pomocą funkcji CONCAT(). Rok może być dowolnym rokiem (np. 0001 ), a dzień może być dowolnym dniem (np. 01 ):
CONCAT('0001 ', birthday_month, ' 01')
CONCAT() funkcja łączy wszystkie argumenty w jeden ciąg. Ciąg powinien znajdować się w 'Year Month Day ', więc drugim argumentem powinien być birthday_month; pierwszy i trzeci argument muszą być po prostu w poprawnym formacie.
Następnie musisz przekonwertować ten ciąg na datę za pomocą STR_TO_DATE(date_string, '%Y %M %d') funkcjonować. Drugim argumentem tej funkcji jest format daty. %Y oznacza rok, %M oznacza miesiąc (pełna nazwa, a nie numer) i %d oznacza dzień.
STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d')
Użyj go z ORDER BY klauzula sortowania wierszy w porządku rosnącym według daty. Jeśli chcesz zobaczyć wiersze w kolejności malejącej, po prostu dołącz DESC słowo kluczowe, takie jak to:
SELECT *
FROM birthday
ORDER BY STR_TO_DATE(CONCAT('0001 ', birthday_month, ' 01'), '%Y %M %d') DESC;
Zauważ, że w MySQL NULL s są wyświetlane jako pierwsze przy sortowaniu w porządku rosnącym i jako ostatnie przy sortowaniu w porządku malejącym. Ponadto wiersze z tym samym birthday_month są wyświetlane w losowej kolejności (możesz zobaczyć Angie Julia trzeci i Narelle Dillan czwarty lub Narelle Dillan trzecia i Angie Julia czwarty).